Skip to content

Instantly share code, notes, and snippets.

@pascalpoitras
Last active March 27, 2024 21:56
Star You must be signed in to star a gist
Save pascalpoitras/8406501 to your computer and use it in GitHub Desktop.
My WeeChat configuration

WeeChat Screenshot

Mouse


enable


/mouse enable


Network


default

Dependencies:

  • Plugins: irc
  • Secures: defaultsasluser, defaultnicks

/set irc.server_default.sasl_mechanism PLAIN
/set irc.server_default.sasl_username ${sec.data.defaultsasluser}
/set irc.server_default.nicks ${sec.data.defaultnicks}
/set irc.server_default.capabilities "*"
/set irc.server_default.autojoin_dynamic on


specific

Dependencies:

  • Plugins: irc
  • Secures: liberachatpass

/server add libera irc.libera.chat/6697 -autoconnect
/set irc.server.libera.sasl_password ${sec.data.liberachatpass}

/server add oftc irc.oftc.net/6697 -autoconnect
/set irc.server.oftc.tls_cert "%h/tls/nick.pem"
/set irc.server.oftc.command_delay 5

/connect -auto


Plugins


irc

Dependencies:

  • Plugins: irc

/set irc.server_default.away_check 5
/set irc.server_default.away_check_max_nicks 25
/set irc.color.nick_prefixes "q:lightred;a:lightcyan;o:121;h:lightmagenta;v:229;*:lightblue"
/set irc.network.ban_mask_default "*!*@$host"
/set irc.look.buffer_switch_autojoin off
/set irc.look.buffer_switch_join off
/set irc.look.color_nicks_in_nicklist on
/set irc.look.part_closes_buffer on
/set irc.look.server_buffer independent
/set irc.color.mirc_remap "1,-1:16;14,-1:240"
/set irc.color.message_join 121
/set irc.color.message_quit 131


spell

Dependencies:

  • Plugins: spell

/set spell.check.default_dict en,fr
/set spell.check.suggestions 3
/set spell.color.suggestion *green
/spell enable


logger

Dependencies:

  • Plugins: logger

/set logger.level.irc 4
/set logger.mask.irc %Y/$server/$channel.%m-%d.log


fset

Dependencies:

  • WeeChat: 3.0
  • Plugins: fset

/set fset.color.line_selected_bg1 default
/set fset.color.name_changed 229
/set fset.color.name_changed_selected *229
/set fset.color.type 121
/set fset.color.type_selected *121
/set fset.color.value 31
/set fset.color.value_changed 229
/set fset.color.value_changed_selected *229
/set fset.color.value_selected *31
/set fset.look.auto_refresh "*,!weechat.bar.buflist.size,!plugins.var.group_tools.buflist_main.section.*,!plugins.var.group_tools.sys_usage.item.sys_usage.encoded"
/set fset.format.option1 "${if:${selected_line}?${color:*white}>>:  } ${marked} ${name}  ${type}  ${value2}"
/set weechat.bar.fset.conditions "${buffer.full_name} == fset.fset && ${window.win_height} > 7"  


relay

Dependencies:

  • Plugins: relay
  • Secures: relaypass

/relay tlscertkey
/relay add tls.weechat <port>
/set relay.network.password "${sec.data.relaypass}"


Scripts


autosort

Dependencies:

  • Plugins: python, script
  • Scripts: autosort.py

/autosort helpers set monitors_buffers_first ${if:${buffer.full_name}!~^core\.(chan|high|news)mon$}
/autosort rules insert 3 ${monitors_buffers_first}


cmd_help

Dependencies:

  • Plugins: python, script
  • Scripts: cmd_help.py

/set plugins.var.python.cmd_help.color_delimiters "*white"
/set plugins.var.python.cmd_help.color_arguments "121"
/set plugins.var.python.cmd_help.color_list "121"
/set plugins.var.python.cmd_help.start_on_load "on"
/set plugins.var.python.cmd_help.stop_on_enter "off"
/cmd_help


Triggers


utils_group_tools

Dependencies:

  • WeeChat: 3.4
  • Plugins: trigger

/trigger addreplace utils_group_tools command "group_tools;manage the options of one or more groups;set <grp>,[<grp>...] <ns>,[<ns>...] <sec>,[<sec>...] <prop>,[<prop>...] <val> || add <grp>,[<grp>...] <ns>,[<ns>...] <sec>,[<sec>...] ${\x22}<prop>${\x22} ${\x22}<val>${\x22} [${\x22}<prop>${\x22} ${\x22}<val>${\x22}...]; set: set the same value for one or more options${\n} add: set the same or differents values for one or more options${\n} grp: a group${\n}  ns: a namespace${\n} sec: a section${\n}prop: a property${\n} val: a value${\n}${\n}Set the values of 6 options:${\n}${\n}   /group_tools add chanmon segment nick min ${\x22}5${\x22} max ${\x22}5${\x22} fg ${\x22}white${\x22} bg ${\x22}24${\x22} sep ${\x22}black${\x22} content ${\x22}${raw:${tg_tag_nick}}${\x22}${\n}${\n}Which result in creating or updating the following options:${\n}${\n}   ${define:my_opt_prefix,plugins.var.group_tools.chanmon.segment.nick}${my_opt_prefix}.min${\n}   ${my_opt_prefix}.max${\n}   ${my_opt_prefix}.fg${\n}   ${my_opt_prefix}.bg${\n}   ${my_opt_prefix}.sep${\n}   ${my_opt_prefix}.content${\n}${\n}Change the value of min and max to 7:${\n}${\n}   /group_tools set chanmon segment nick min,max 7;set|add"
/trigger set utils_group_tools conditions "${define:my_regex,[abcdefghijklmnopqrstuvwxyz0-9_]+}${tg_argv_eol1} =~ (?-i)^set +(${my_regex},?)+ +(${my_regex},?)+ +(${my_regex},?)+ +(${my_regex},?)+ . || ${tg_argv_eol1} =~ (?-i)^add +(${my_regex},?)+ +(${my_regex},?)+ +(${my_regex},?)+ . && ${tg_shell_argv5} =~ ^${my_regex}$"
/trigger set utils_group_tools regex "/.*/[abcdefghijklmnopqrstuvwxyz0-9_]+/my_regex /.*/${tg_argv1}/my_action /.*/${tg_argv2}/my_groups /[^,]$/${re:0},/my_groups /.*/${tg_argv3}/my_namespaces /[^,]$/${re:0},/my_namespaces /.*/${tg_argv4}/my_sections /[^,]$/${re:0},/my_sections /.*/${if:${my_action}==set?${tg_argv5}}/my_set_properties /.*/${if:${my_action}==add?${repeat:${calc:${tg_shell_argc}-5},,}}/my_add_properties /,/${define:my_argv_number,${calc:${re:repl_index}+4}}${if:${re:repl_index}=~[13579]$&&${tg_shell_argv${my_argv_number}}=~^${my_regex}$?${my_argv_number},}/my_add_properties /.*/${my_${my_action}_properties}/my_properties /[^,]$/${re:0},/my_properties /.*/${split:count,,strip_right,${my_groups}}/my_nb_of_groups /.*/${split:count,,strip_right,${my_namespaces}}/my_nb_of_namespaces /.*/${split:count,,strip_right,${my_sections}}/my_nb_of_sections /.*/${split:count,,strip_right,${my_properties}}/my_nb_of_properties /[^,]+,/${repeat:${calc:${my_nb_of_namespaces}*${my_nb_of_sections}*${my_nb_of_properties}},${re:0}}/my_groups /[^,]+,/${repeat:${calc:${my_nb_of_sections}*${my_nb_of_properties}},${re:0}}/my_namespaces /.*/${repeat:${my_nb_of_groups},${re:0}}/my_namespaces /[^,]+,/${repeat:${my_nb_of_properties},${re:0}}/my_sections /.*/${repeat:${calc:${my_nb_of_groups}*${my_nb_of_namespaces}},${re:0}}/my_sections /.*/${repeat:${calc:${my_nb_of_groups}*${my_nb_of_namespaces}*${my_nb_of_sections}},${re:0}}/my_properties /.*/${my_properties}/my_cmds_to_run ===([^,]+),===${define:my_group,${split:${re:repl_index},,,${my_groups}}}${define:my_namespace,${split:${re:repl_index},,,${my_namespaces}}}${define:my_section,${split:${re:repl_index},,,${my_sections}}}${define:my_property,${if:${my_action}==set?${re:1}:${tg_shell_argv${re:1}}}}${define:my_value,${if:${my_action}==set?${tg_argv_eol6}:${tg_shell_argv${calc:${re:1}+1}}}}${define:my_quote,${if:${my_action}==add?'}}/mute -core /set plugins.var.group_tools.${my_group}.${my_namespace}.${my_section}.${my_property} ${my_quote}\${base_decode:16,${base_encode:16,${my_value}}}${my_quote};===my_cmds_to_run"
/trigger set utils_group_tools command "/command -buffer core.weechat * /eval -s ${my_cmds_to_run}"

this trigger create the group_tools command which is used throughout this configuration. It allows us to create many options easily.



utils_search_server_buffer_ptr

Dependencies:

  • WeeChat: 4.1.0
  • Plugins: trigger

/trigger addreplace utils_search_server_buffer_ptr info "search_server_buffer_ptr"
/trigger set utils_search_server_buffer_ptr conditions "${tg_arguments} != && (${buffer[${tg_arguments}].local_variables.script_name} =~ ^(matrix|slack)$ || ${buffer[${tg_arguments}].local_variables.plugin} =~ ^(irc|matrix))$"
/trigger set utils_search_server_buffer_ptr regex "/.*/${buffer[${tg_arguments}].local_variables.plugin}/my_plugin /.*/${buffer[${tg_arguments}].local_variables.script_name}/my_script /.*/${buffer[${tg_arguments}].local_variables.server}/my_server /.*/${info:buffer,${if:${my_plugin}=~^(irc|matrix)$||${my_script}==matrix?${my_plugin}.server.${my_server}:${my_plugin}.${my_server}}}/tg_info"

This trigger create an info named search_server_buffer_ptr which receive a buffer pointer and return the buffer pointer of the corresponding server (works with IRC, Slack and matrix)



utils_date_calc_days

Dependencies:

  • Plugins: python, trigger

/trigger addreplace utils_date_calc_days info "date_calc_days"
/trigger set utils_date_calc_days conditions "${tg_arguments} =~ ^[0-9]{4}-(1[0-2]|0[1-9])-(3[01]|0[1-9]|[12][0-9])$ && ${info:python_version} !="
/trigger set utils_date_calc_days regex "/.*/${info:python_eval,from datetime import datetime; date1 = datetime.today(); date2 = datetime.strptime('${tg_arguments}', '%Y-%m-%d'); delta = date1 - date2; print(abs(delta.days))}/tg_info"

Calculate the number of days between two dates. For the time being, only used by dev_info



utils_date_preferred

Dependencies:

  • Plugins: python, trigger

/trigger addreplace utils_date_preferred info "date_preferred"
/trigger set utils_date_preferred conditions "${tg_arguments} =~ ^[0-9]{4}-(1[0-2]|0[1-9])-(3[01]|0[1-9]|[12][0-9])$ && ${info:python_version} !="
/trigger set utils_date_preferred regex "/.*/${info:python_eval,from datetime import datetime; print(datetime.strptime('${tg_arguments}', '%Y-%m-%d').strftime('%x'))}/tg_info"

transform a date to local representation. For the time being, only used by dev_info



Buflist


buflist_main

WeeChat Screenshot

Dependencies:

  • WeeChat: 4.1.0
  • Plugins: buflist, trigger
  • Triggers: utils_search_server_buffer_ptr

/set buflist.look.use_items 4

we will use 4 buflist items

/set buflist.look.signals_refresh "irc_server_connected"

refresh the buflist for the irc_server_connected signal

/set buflist.look.display_conditions "${define:my_solution,buflist_${if:${bar_item.name}=~t$?main:favorite_${calc:${split:2,t,,${bar_item.name}}-1}}}${eval_cond:${plugins.var.group_tools.${my_solution}.buflist.look.display_conditions}}"
/set plugins.var.group_tools.buflist_main.buflist.look.display_conditions "(${buffer.hidden} == || ${plugins.var.group_tools.buflist_main.feature.show_hidden_buffers.enabled} !=) && (${type} !~ ^(channel|private)$ || ${type} =~ ^(channel|private)$ && ${buffer[${info:search_server_buffer_ptr,${buffer}}].local_variables.buflist_main_fold}==)"

this is the conditions to know if a buffer should be included

/set buflist.format.buffer "${define:my_solution,buflist_${if:${bar_item.name}=~t$?main:favorite_${calc:${split:2,t,,${bar_item.name}}-1}}}${eval:${plugins.var.group_tools.${my_solution}.buflist.format.buffer}}"
/set buflist.format.buffer_current "${format_buffer}"
/set plugins.var.group_tools.buflist_main.buflist.format.buffer "${define:my_left_section_contents,${eval:${format_number}${plugins.var.group_tools.buflist_main.element.fold.format}${indent}${format_nick_prefix}${format_name}${format_lag}${plugins.var.group_tools.buflist_main.element.filter.format}}}${define:my_left_section_contents_length,${lengthscr:${my_left_section_contents}}}${define:my_right_section_contents,${eval:${format_hotlist}}}${define:my_right_section_contents_length,${lengthscr:${my_right_section_contents}}}${if:${type}==server?${color:,31}:${color:default}}${if:${my_left_section_contents_length} > ${plugins.var.group_tools.buflist_main.section.left.size}?${cutscr:+${plugins.var.group_tools.buflist_main.section.left.size},${if:${type}==server?${color:white}:${color:${weechat.color.chat_prefix_more}}}${weechat.look.prefix_align_more},${my_left_section_contents}}:${my_left_section_contents}${repeat:${calc:${plugins.var.group_tools.buflist_main.section.left.size} - ${my_left_section_contents_length}}, }}${if:${my_right_section_contents_length} > ${plugins.var.group_tools.buflist_main.section.right.size}?${cutscr:+${plugins.var.group_tools.buflist_main.section.right.size},${if:${type}==server?${color:white}:${color:${weechat.color.chat_prefix_more}}}${weechat.look.prefix_align_more},${my_right_section_contents}}:${repeat:${calc:${plugins.var.group_tools.buflist_main.section.right.size} - ${my_right_section_contents_length}}, }${my_right_section_contents}}"

This was the formatting of the buffers that pass the conditions

/bar set buflist priority 2000

change the buflist bar priority

/trigger addreplace buflist_main_tools command "buflist_main;manage main buflist (https://gist.github.com/pascalpoitras/8406501);resize <left_size> <right_size> || hide|show|etoggle|showonly|hideonly <element> [<element>...] || enable|disable|toggle <feature> [<feature>...];      resize: resize the buflist size and the two sections${\n}        hide: hide one or more element(s)${\n}        show: show one or more element(s)${\n}     etoggle: toggle one or more element(s)${\n}   show-only: hide all elements except...${\n}   hide-only: show all elements except...${\n}      enable: enable a feature that change the behavior of the buflist${\n}     disable: disable a feature that change the behavior of the buflist${\n}      toggle: toggle a feature that change the behavior of the buflist${\n} enable-only: disable all features except...${\n}disable-only: enable all features except...${\n}   left_size: size of left section${\n}  right_size: size of right section${\n}     element: an element (* for all)${\n}     feature: a feature (* for all)${\n}${\n}${color:bold}${color:underline}Sections${color:-bold}${color:-underline}${\n}${\n} There are two sections:${\n}${\n}  - The ${color:bold}left${color:-bold} section contains the following elements: ${color:bold}number${color:-bold}, ${color:bold}fold${color:-bold}, ${color:bold}indent${color:-bold}, ${color:bold}nick_prefix${color:-bold}, ${color:bold}name${color:-bold}, ${color:bold}lag${color:-bold} and ${color:bold}filter${color:-bold}${\n}  - The ${color:bold}right${color:-bold} section contains the following element: ${color:bold}hotlist${color:-bold}.${\n}${\n} Example:${\n}${\n}   Resize the sections:${\n}${\n}     /buflist_main resize 15 5${\n}${\n}${color:bold}${color:underline}Elements${color:reset}${\n}${\n} There are height elements:${\n}${\n}  - The ${color:bold}number${color:-bold} element is used to display the buffer number on all buffers.${\n}  - The ${color:bold}fold${color:-bold} element is used to display an arrow on servers buffers which, when click, shows or hides the channels, queries and list buffers of that server.${\n}  - The ${color:bold}indent${color:-bold} element is used to display indentation on channels, queries and lists buffers.${\n}  - The ${color:bold}nick_prefix${color:-bold} element is used to display your nick prefix on channels buffers.${\n}  - The ${color:bold}name${color:-bold} element is used to display the buffer name on all buffers.${\n}  - The ${color:bold}lag${color:-bold} element is used to display the lag on servers buffers.${\n}  - The ${color:bold}filter${color:-bold} element is used to display the content of the filter localvar on buffer with that localvar set (the monitor, fset, script, irc raw buffer and others).${\n}  - The ${color:bold}hotlist${color:-bold} element is used to display the hotlist on all buffers.${\n}${\n} Example:${\n}${\n}   Display every element except nick_prefix and lag:${\n}${\n}     /buflist_main hideonly nick_prefix lag${\n}${\n}${color:bold}${color:underline}Features${color:reset}${\n}${\n} There are three features:${\n}${\n}  - The ${color:bold}indent_tree${color:-bold} feature is used when you prefer to have symbols instead of spaces as indentation.${\n}  - The ${color:bold}real_net_name${color:-bold} feature is used when you prefer to see the real network name instead of the server name you provided to /server add${\n}  - The ${color:bold}show_hidden_buffers${color:-bold} feature is used when you want to show the hidden buffers${\n}${\n} Example:${\n}${\n}   Enable the indent_tree and real_net_name features${\n}${\n}     /buflist_main enable indent_tree real_net_name;resize 15 5 || show|hide|etoggle|hideonly|showonly number|fold|indent|nick_prefix|name|lag|filter|hotlist|*|%* || enable|disable|toggle indent_tree|real_net_name|show_hidden_buffers|*|%*"
/trigger set buflist_main_tools conditions "${tg_argv_eol1} =~ ^resize +[0-9]+ +[0-9]+$ || ${tg_argv_eol1} =~ ^(hide|show|etoggle|show-only|hide-only|enable|enable-only|disable|disable-only|toggle) +(([abcdefghijklmnopqrstuvwxyz0-9_]+ *)+|\*)$"
/trigger set buflist_main_tools regex "/.*/${tg_argv1}/my_action /.*/${if:${my_action}==resize?section:${if:${my_action}=~^(enable|disable|toggle)?feature:element}}/my_type /.*/plugins.var.group_tools.buflist_main.${my_type}/my_opt_prefix ===.*===${if:${my_action}==resize?/mute -core /set ${my_opt_prefix}.left.size ${tg_argv2};/mute -core /set ${my_opt_prefix}.right.size ${tg_argv3};/bar set buflist size ${calc:${tg_argv2}+${tg_argv3}}}===my_resize_cmds /.*/${if:${my_type}==feature?indent_tree real_net_name show_hidden_buffers:${if:${my_type}==element?number fold indent nick_prefix name lag filter hotlist}}/my_whole_list /.*/${if:${my_type}=~^(feature|element)?${tg_argv_eol2}}/my_features_elements_cmds2 /\*/${my_whole_list}/my_features_elements_cmds2 /.*/${if:${my_action}=~-only$?${my_whole_list}}/my_features_elements_cmds1 ===([^ ]+) ?===/mute -core /set ${my_opt_prefix}.${re:1}.enabled ${if:${my_action}=~^(disable|hide)-only$};===my_features_elements_cmds1 ===([^ ]+) ?===/mute -core /set ${my_opt_prefix}.${re:1}.enabled ${if:${my_action}=~^(disable|hide)?0:${if:${my_action}=~^(enable|show)?1:${if:${${my_opt_prefix}.${re:1}.enabled}!=?0:1}}};===my_features_elements_cmds2 /.*/${my_resize_cmds}${my_features_elements_cmds1}${my_features_elements_cmds2}/my_cmds_to_run"
/trigger set buflist_main_tools command "/command -buffer core.weechat * /eval -s ${my_cmds_to_run}"

This trigger create the command buflist_main. With this command, you can resize the main buflist in addition to enabling/disabling elements and features

/buflist_main resize 15 5

resize the buflist bar to 20 allowing 15 for the first section and 5 for the second section

/buflist_main hide-only nick_prefix lag
/buflist_main enable indent_tree real_net_name

show all elements in the main buflist except nick_prefix and lag. Enable the indent_tree and real_net_name features

/set buflist.format.hotlist_highlight "${color:163}"
/set buflist.format.hotlist_message "${color:229}"
/set buflist.format.hotlist_private "${color:121}"

the colors for highlight, message and private

/set buflist.format.number "${if:${plugins.var.group_tools.buflist_main.element.number.enabled}!=?${if:${current_buffer}!=?${color:*white}${hide:>,${number}} :${if:${type}==server?${color:black}:${color:239}}${number}${if:${number_displayed}!=?.: }}}"
/set buflist.format.indent "${if:${plugins.var.group_tools.buflist_main.element.indent.enabled}!=?${if:${plugins.var.group_tools.buflist_main.feature.indent_tree.enabled}!=?${color:31}├─:  }}"
/set buflist.format.name "${if:${plugins.var.group_tools.buflist_main.element.name.enabled}!=?${define:my_name,${if:${type}==server?${if:${plugins.var.group_tools.buflist_main.feature.real_net_name.enabled}!=&&${info:irc_server_isupport_value,${name},NETWORK}!=?${info:irc_server_isupport_value,${name},NETWORK}:${name}}:${name}}}${define:my_name_length,${lengthscr:${my_name}}}${define:my_name,${if:${buffer.local_variables.buflist_main_start_at}!=?${revscr:${cutscr:+${calc:${my_name_length}-${buffer.local_variables.buflist_main_start_at}},…,${revscr:${my_name}}}}:${my_name}}}${if:${type}==server?${color:white}:${eval:${color_hotlist}}}${my_name}}"
/set buflist.format.hotlist "${if:${plugins.var.group_tools.buflist_main.element.hotlist.enabled}!=?${if:${plugins.var.group_tools.buflist_main.section.right.size}==1? :${hotlist}}}"
/set buflist.format.nick_prefix "${if:${plugins.var.group_tools.buflist_main.element.nick_prefix.enabled}!=&&${buflist.look.nick_prefix}!=?${color:31}${nick_prefix}}"
/set buflist.format.lag "${if:${plugins.var.group_tools.buflist_main.element.lag.enabled}!=?${color:white} [${lag}]}"
/set plugins.var.group_tools.buflist_main.element.fold.format "${if:${plugins.var.group_tools.buflist_main.element.fold.enabled}!=&&${type}==server?${color:black}${if:${buffer.local_variables.buflist_main_fold}==?▼:▲} }"
/set plugins.var.group_tools.buflist_main.element.filter.format "${if:${plugins.var.group_tools.buflist_main.element.filter.enabled}!=&&${buffer.local_variables.filter}!=? ${if:${type}==server?${color:black}:${color:31}}${buffer.local_variables.filter}}"

The format for the different buflist elements

/trigger addreplace buflist_main_refresh config "plugins.var.group_tools.buflist_main.*" "" "" "/buflist refresh buflist"

Refresh this buflist when one of its options changes

/key bindctxt cursor @item(buflist*):f /mute /toggle weechat.buffer.${plugin}.${if:${plugin}==irc||${buffer[${pointer}].local_variables.script_name}==matrix||${plugin}==matrix?server.}${localvar_server}.localvar_set_buflist_main_fold 1 '';/cursor stop
/key bindctxt cursor @item(buflist*):r /server raw c:\${${if:${localvar_type}==private?nick:${localvar_type}}}==${localvar_channel};/cursor stop
/key bindctxt cursor @item(buflist*):o /fset c:\${name}=*weechat.buffer.${full_name}.* ${if:${localvar_type}==server?|| \${name${\x7D}=*${full_name}.*};/cursor stop
/key bindctxt cursor @item(buflist*):n /mute /toggle weechat.buffer.${full_name}.localvar_set_no_chanmon_like 1 '';/cursor stop
/key bindctxt cursor @item(buflist*):h /mute /toggle weechat.buffer.${full_name}.hidden 1 '';/cursor stop
/key bindctxt cursor @item(buflist*):H /buflist_main toggle show_hidden_buffers;/cursor stop
/key bindctxt cursor @item(buflist*):1 /mute /toggle weechat.buffer.${full_name}.localvar_set_buflist_favorite_1 1'';/cursor stop
/key bindctxt cursor @item(buflist*):2 /mute /toggle weechat.buffer.${full_name}.localvar_set_buflist_favorite_2 1'';/cursor stop
/key bindctxt cursor @item(buflist*):3 /mute /toggle weechat.buffer.${full_name}.localvar_set_buflist_favorite_3 1'';/cursor stop
/key bindctxt mouse @bar(buflist):ctrl-alt-wheel* /mute /set weechat.buffer.${full_name}.localvar_set_${_bar_name}_main_start_at ${define:my_start_at,${buffer[${pointer}].local_variables.${_bar_name}_main_start_at}}${if:${_key}=~-wheelup$&&${my_start_at}==?0:${calc:${my_start_at}${if:${_key}=~up&&${my_start_at}!=?-:+}1}}
/key bindctxt mouse @bar(buflist):alt-wheel* hsignal:buflist_main_resize
  1. Pressing 'f' in cursor mode on any buflists items will toggle the folding of the server to which the buffer under the cursor belong
  2. Pressing 'r' in cursor mode on any buflists items will show the entries for the buffer under the cursor in the /server raw buffer
  3. Pressing 'o' in cursor mode on any buflists items will show the options for the buffer under the cursor in /fset
  4. Pressing 'n' in cursor mode on any buflists items will toggle the no_chanmon_like localvar of the buffer under the cursor
  5. Pressing 'h' in cursor mode on any buflists items will toggle the hidden property of the buffer under the cursor
  6. Pressing 'H' in cursor mode on any buflists items will toggle the view of the hidden buffers in the main buflist
  7. Pressing '1' in cursor mode on any buflists items will toggle the buflist_favorite_1 localvar of the buffer under the cursor
  8. Pressing '2' in cursor mode on any buflists items will toggle the buflist_favorite_2 localvar of the buffer under the cursor
  9. Pressing '3' in cursor mode on any buflists items will toggle the buflist_favorite_3 localvar of the buffer under the cursor
  10. Pressing 'ctrl-alt-wheelup' and 'ctrl-alt-wheeldown' on any buflists bars will scroll the buffer name of the buffer under the mouse
  11. Pressing 'alt-wheelup' and 'alt-wheeldown' on the buflist bar will resize the bar
/trigger addreplace buflist_main_resize hsignal "buflist_main_resize"
/trigger set buflist_main_resize conditions "${_key}=~down || ${_key}=~up && (${_bar_item_col} < ${plugins.var.group_tools.buflist_main.section.left.size} && ${plugins.var.group_tools.buflist_main.section.left.size} > 1 || ${_bar_item_col} >= ${plugins.var.group_tools.buflist_main.section.left.size} && ${plugins.var.group_tools.buflist_main.section.right.size} > 1)"
/trigger set buflist_main_resize regex "/.*/${if:${_key}=~up$?-:+}/my_action /.*/${if:${_bar_item_col}<${plugins.var.group_tools.buflist_main.section.left.size}?left:right}/my_modified_section /.*/${calc:${plugins.var.group_tools.buflist_main.section.${my_modified_section}.size} ${my_action} 1}/my_modified_section_size /.*/${if:${weechat.bar.${_bar_name}.size}!=?${calc:${weechat.bar.${_bar_name}.size} ${my_action} 1}:0}/my_new_bar_size"
/trigger set buflist_main_resize command "/mute /set plugins.var.group_tools.buflist_main.section.${my_modified_section}.size ${my_modified_section_size};/bar set ${_bar_name} size ${my_new_bar_size}"

This trigger manage the resizing of the main buflist and its sections

/trigger addreplace buflist_main_fold hsignal "1001|buflist_mouse"
/trigger set buflist_main_fold conditions "${localvar_type} == server && ${plugins.var.group_tools.buflist_main.element.fold.enabled} != && (${plugins.var.group_tools.buflist_main.element.number.enabled} != && ${_bar_item_col} == ${lengthscr:${buffer[last_gui_buffer].number}.} || ${plugins.var.group_tools.buflist_main.element.number.enabled} == && ${_bar_item_col} == 0)"
/trigger set buflist_main_fold command "/mute /toggle weechat.buffer.${full_name}.localvar_set_buflist_main_fold 1 ''"
/trigger set buflist_main_fold return_code "ok_eat"

manage the folding when you click on the arrow in front of a server in the main buflist



buflist_favorite_1

WeeChat Screenshot

Dependencies:

  • WeeChat: 4.1.0
  • Plugins: buflist, trigger
  • Triggers: utils_search_server_buffer_ptr, utils_group_tools

/set buflist.look.use_items 4

we will use 4 buflist items

/set buflist.look.signals_refresh "irc_server_connected"

refresh the buflist for the irc_server_connected signal

/set buflist.look.display_conditions "${define:my_solution,buflist_${if:${bar_item.name}=~t$?main:favorite_${calc:${split:2,t,,${bar_item.name}}-1}}}${eval_cond:${plugins.var.group_tools.${my_solution}.buflist.look.display_conditions}}"
/set plugins.var.group_tools.buflist_favorite_1.buflist.look.display_conditions ${buffer.local_variables.buflist_favorite_1} !=

this is the conditions to know if a buffer should be included

/set buflist.format.buffer "${define:my_solution,buflist_${if:${bar_item.name}=~t$?main:favorite_${calc:${split:2,t,,${bar_item.name}}-1}}}${eval:${plugins.var.group_tools.${my_solution}.buflist.format.buffer}}"
/set buflist.format.buffer_current "${format_buffer}"
/set plugins.var.group_tools.buflist_favorite_1.buflist.format.buffer "${define:my_name,${if:${type}==server?${if:${plugins.var.group_tools.buflist_favorite_1.feature.real_net_name.enabled}!=&&${info:irc_server_isupport_value,${name},NETWORK}!=?${info:irc_server_isupport_value,${name},NETWORK}:${name}}:${name}}}${define:my_name_length,${lengthscr:${my_name}}}${define:my_name,${if:${buffer.local_variables.buflist_favorite_1_start_at}!=?${revscr:${cutscr:+${calc:${my_name_length}-${buffer.local_variables.buflist_favorite_1_start_at}},…,${revscr:${my_name}}}}:${my_name}}}${define:my_section,${if:${window.buffer}==${buffer}?active:inactive}}${define:my_opt_prefix,plugins.var.group_tools.buflist_favorite_1.tab.${my_section}}${define:my_tab_fg,${${my_opt_prefix}.fg}}${define:my_tab_bg,${${my_opt_prefix}.bg}}${define:my_tab_min,${${my_opt_prefix}.min}}${define:my_tab_max,${${my_opt_prefix}.max}}${define:my_tab_prefix,${${my_opt_prefix}.prefix}}${define:my_tab_suffix,${${my_opt_prefix}.suffix}}${define:my_name,${cutscr:+${if:${my_tab_max}==0?${calc:${lengthscr:${my_name}}+1}:${my_tab_max}},…,${my_name}}${repeat:${calc:${my_tab_min}-${lengthscr:${my_name}}}, }}${color:${my_tab_bg}}${my_tab_prefix}${color:${my_tab_fg},${my_tab_bg}} ${my_name} ${color:reset}${color:${my_tab_bg}}${my_tab_suffix}"

This was the formatting of the buffers that pass the conditions

/group_tools set buflist_favorite_1 feature real_net_name enabled 1
/group_tools add buflist_favorite_1 tab active fg "*white" bg "31" min "5" max "5" prefix "" suffix ""
/group_tools add buflist_favorite_1 tab inactive fg "*234" bg "24" min "5" max "5" prefix "" suffix ""
  1. Enable the real_net_name feature
  2. Set the apparence of the active tab
  3. Set the apparence of the inactive(s) tab(s)
/bar add buflist_favorite_1 window bottom 1 1 spacer,buflist2,spacer
/bar set buflist_favorite_1 priority 499
/bar set buflist_favorite_1 conditions ${window.number} == 1
/bar set buflist_favorite_1 color_bg 234
/bar set buflist_favorite_1 color_bg_inactive 234

add the buflist_favorite_1 bar

/trigger addreplace buflist_favorite_1_refresh config "plugins.var.group_tools.buflist_favorite_1.*" "" "" "/buflist refresh buflist2"

Refresh this buflist when one of its options changes

/key bindctxt cursor @item(buflist*):f /mute /toggle weechat.buffer.${plugin}.${if:${plugin}==irc||${buffer[${pointer}].local_variables.script_name}==matrix||${plugin}==matrix?server.}${localvar_server}.localvar_set_buflist_main_fold 1 '';/cursor stop
/key bindctxt cursor @item(buflist*):r /server raw c:\${${if:${localvar_type}==private?nick:${localvar_type}}}==${localvar_channel};/cursor stop
/key bindctxt cursor @item(buflist*):o /fset c:\${name}=*weechat.buffer.${full_name}.* ${if:${localvar_type}==server?|| \${name${\x7D}=*${full_name}.*};/cursor stop
/key bindctxt cursor @item(buflist*):n /mute /toggle weechat.buffer.${full_name}.localvar_set_no_chanmon_like 1 '';/cursor stop
/key bindctxt cursor @item(buflist*):h /mute /toggle weechat.buffer.${full_name}.hidden 1 '';/cursor stop
/key bindctxt cursor @item(buflist*):H /buflist_main toggle show_hidden_buffers;/cursor stop
/key bindctxt cursor @item(buflist*):1 /mute /toggle weechat.buffer.${full_name}.localvar_set_buflist_favorite_1 1'';/cursor stop
/key bindctxt cursor @item(buflist*):2 /mute /toggle weechat.buffer.${full_name}.localvar_set_buflist_favorite_2 1'';/cursor stop
/key bindctxt cursor @item(buflist*):3 /mute /toggle weechat.buffer.${full_name}.localvar_set_buflist_favorite_3 1'';/cursor stop
/key bindctxt mouse @bar(buflist_*):ctrl-alt-wheel* /mute /set weechat.buffer.${full_name}.localvar_set_${_bar_name}_start_at ${define:my_start_at,${buffer[${pointer}].local_variables.${_bar_name}_start_at}}${if:${_key}=~-wheelup$&&${my_start_at}==?0:${calc:${my_start_at}${if:${_key}=~up&&${my_start_at}!=?-:+}1}}
/key bindctxt mouse @item(buflist2):button1* /mute /set plugins.var.group_tools.${_bar_name}.monitor.window.previous ${window.number};/window ${_window_number};hsignal:buflist_mouse;/window ${plugins.var.group_tools.${_bar_name}.monitor.window.previous}
/key bindctxt mouse @item(buflist*)>bar(buflist_*):button1* /mute /toggle weechat.buffer.${full_name}.localvar_set_${_bar_name2} 1 ''
/key bindctxt mouse @chat(*)>bar(buflist_*):button1* /mute /toggle weechat.buffer.${_buffer_full_name}.localvar_set_${_bar_name2} 1 ''
  1. Pressing 'f' in cursor mode on any buflists items will toggle the folding of the server to which the buffer under the cursor belong
  2. Pressing 'r' in cursor mode on any buflists items will show the entries for the buffer under the cursor in the /server raw buffer
  3. Pressing 'o' in cursor mode on any buflists items will show the options for the buffer under the cursor in /fset
  4. Pressing 'n' in cursor mode on any buflists items will toggle the no_chanmon_like localvar of the buffer under the cursor
  5. Pressing 'h' in cursor mode on any buflists items will toggle the hidden property of the buffer under the cursor
  6. Pressing 'H' in cursor mode on any buflists items will toggle the view of the hidden buffers in the main buflist
  7. Pressing '1' in cursor mode on any buflists items will toggle the buflist_favorite_1 localvar of the buffer under the cursor
  8. Pressing '2' in cursor mode on any buflists items will toggle the buflist_favorite_2 localvar of the buffer under the cursor
  9. Pressing '3' in cursor mode on any buflists items will toggle the buflist_favorite_3 localvar of the buffer under the cursor
  10. Pressing 'ctrl-alt-wheelup' and 'ctrl-alt-wheeldown' on any buflists bars will scroll the buffer name of the buffer under the mouse
  11. Clicking with the left mouse button on the buflist2 item will change the active window to the one of the bar, change the buffer to the buffer under the mouse and change window back to the orignal one
  12. Dragging from any buflists items to a favorites bars will toggle the localvar with the same name as the bar for the buffer under the mouse
  13. Dragging any chats areas to a favorites bars will toggle the localvar with the same name as the bar for the buffer in the chat area
/set weechat.buffer.core.weechat.localvar_set_buflist_favorite_1 1
/set weechat.buffer.irc.libera.##r3m.localvar_set_buflist_favorite_1 1
/set weechat.buffer.irc.libera.#weechat.localvar_set_buflist_favorite_1 1
/set weechat.buffer.irc.libera.#ircv3.localvar_set_buflist_favorite_1 1

Add four buffers to the buflist_favorite_1 bar



buflist_favorite_2

WeeChat Screenshot

Dependencies:

  • WeeChat: 4.1.0
  • Plugins: buflist, trigger
  • Triggers: utils_search_server_buffer_ptr, utils_group_tools

/set buflist.look.use_items 4

we will use 4 buflist items, but if you intend to use only this buflist, put it to 1

/set buflist.look.signals_refresh "irc_server_connected"

refresh the buflist for the irc_server_connected signal

/set buflist.look.display_conditions "${define:my_solution,buflist_${if:${bar_item.name}=~t$?main:favorite_${calc:${split:2,t,,${bar_item.name}}-1}}}${eval_cond:${plugins.var.group_tools.${my_solution}.buflist.look.display_conditions}}"
/set plugins.var.group_tools.buflist_favorite_2.buflist.look.display_conditions "${buffer.local_variables.buflist_favorite_2} !="

this is the conditions to know if a buffer should be included

/set buflist.format.buffer "${define:my_solution,buflist_${if:${bar_item.name}=~t$?main:favorite_${calc:${split:2,t,,${bar_item.name}}-1}}}${eval:${plugins.var.group_tools.${my_solution}.buflist.format.buffer}}"
/set buflist.format.buffer_current "${format_buffer}"
/set plugins.var.group_tools.buflist_favorite_2.buflist.format.buffer "${define:my_name,${if:${type}==server?${if:${plugins.var.group_tools.buflist_favorite_2.feature.real_net_name.enabled}!=&&${info:irc_server_isupport_value,${name},NETWORK}!=?${info:irc_server_isupport_value,${name},NETWORK}:${name}}:${name}}}${define:my_name_length,${lengthscr:${my_name}}}${define:my_name,${if:${buffer.local_variables.buflist_favorite_2_start_at}!=?${revscr:${cutscr:+${calc:${my_name_length}-${buffer.local_variables.buflist_favorite_2_start_at}},…,${revscr:${my_name}}}}:${my_name}}}${define:my_section,${if:${window.buffer}==${buffer}?active:inactive}}${define:my_opt_prefix,plugins.var.group_tools.buflist_favorite_2.tab.${my_section}}${define:my_tab_fg,${${my_opt_prefix}.fg}}${define:my_tab_bg,${${my_opt_prefix}.bg}}${define:my_tab_min,${${my_opt_prefix}.min}}${define:my_tab_max,${${my_opt_prefix}.max}}${define:my_tab_prefix,${${my_opt_prefix}.prefix}}${define:my_tab_suffix,${${my_opt_prefix}.suffix}}${define:my_name,${cutscr:+${if:${my_tab_max}==0?${calc:${lengthscr:${my_name}}+1}:${my_tab_max}},…,${my_name}}${repeat:${calc:${my_tab_min}-${lengthscr:${my_name}}}, }}${color:${my_tab_bg}}${my_tab_prefix}${color:${my_tab_fg},${my_tab_bg}} ${my_name} ${color:reset}${color:${my_tab_bg}}${my_tab_suffix}"

This was the formatting of the buffers that pass the conditions

/group_tools set buflist_favorite_2 feature real_net_name enabled 1
/group_tools add buflist_favorite_2 tab active fg "*white" bg "31" min "7" max "7" prefix "" suffix ""
/group_tools add buflist_favorite_2 tab inactive fg "*234" bg "24" min "7" max "7" prefix "" suffix ""
  1. Enable the real_net_name feature
  2. Set the apparence of the active tab
  3. Set the apparence of the inactive(s) tab(s)
/bar add buflist_favorite_2 window top 1 1 buflist3
/bar set buflist_favorite_2 priority 499
/bar set buflist_favorite_2 conditions ${window.number} == 2

add the buflist_favorite_2 bar

/trigger addreplace buflist_favorite_2_refresh config "plugins.var.group_tools.buflist_favorite_2.*" "" "" "/buflist refresh buflist3"

Refresh this buflist when one of its options changes

/key bindctxt cursor @item(buflist*):f /mute /toggle weechat.buffer.${plugin}.${if:${plugin}==irc||${buffer[${pointer}].local_variables.script_name}==matrix||${plugin}==matrix?server.}${localvar_server}.localvar_set_buflist_main_fold 1 '';/cursor stop
/key bindctxt cursor @item(buflist*):r /server raw c:\${${if:${localvar_type}==private?nick:${localvar_type}}}==${localvar_channel};/cursor stop
/key bindctxt cursor @item(buflist*):o /fset c:\${name}=*weechat.buffer.${full_name}.* ${if:${localvar_type}==server?|| \${name${\x7D}=*${full_name}.*};/cursor stop
/key bindctxt cursor @item(buflist*):n /mute /toggle weechat.buffer.${full_name}.localvar_set_no_chanmon_like 1 '';/cursor stop
/key bindctxt cursor @item(buflist*):h /mute /toggle weechat.buffer.${full_name}.hidden 1 '';/cursor stop
/key bindctxt cursor @item(buflist*):H /buflist_main toggle show_hidden_buffers;/cursor stop
/key bindctxt cursor @item(buflist*):1 /mute /toggle weechat.buffer.${full_name}.localvar_set_buflist_favorite_1 1'';/cursor stop
/key bindctxt cursor @item(buflist*):2 /mute /toggle weechat.buffer.${full_name}.localvar_set_buflist_favorite_2 1'';/cursor stop
/key bindctxt cursor @item(buflist*):3 /mute /toggle weechat.buffer.${full_name}.localvar_set_buflist_favorite_3 1'';/cursor stop
/key bindctxt mouse @bar(buflist_*):ctrl-alt-wheel* /mute /set weechat.buffer.${full_name}.localvar_set_${_bar_name}_start_at ${define:my_start_at,${buffer[${pointer}].local_variables.${_bar_name}_start_at}}${if:${_key}=~-wheelup$&&${my_start_at}==?0:${calc:${my_start_at}${if:${_key}=~up&&${my_start_at}!=?-:+}1}}
/key bindctxt mouse @item(buflist3):button1* /mute /set plugins.var.group_tools.${_bar_name}.monitor.window.previous ${window.number};/window ${_window_number};hsignal:buflist_mouse;/window ${plugins.var.group_tools.${_bar_name}.monitor.window.previous}
/key bindctxt mouse @item(buflist*)>bar(buflist_*):button1* /mute /toggle weechat.buffer.${full_name}.localvar_set_${_bar_name2} 1 ''
/key bindctxt mouse @chat(*)>bar(buflist_*):button1* /mute /toggle weechat.buffer.${_buffer_full_name}.localvar_set_${_bar_name2} 1 ''
  1. Pressing 'f' in cursor mode on any buflists items will toggle the folding of the server to which the buffer under the cursor belong
  2. Pressing 'r' in cursor mode on any buflists items will show the entries for the buffer under the cursor in the /server raw buffer
  3. Pressing 'o' in cursor mode on any buflists items will show the options for the buffer under the cursor in /fset
  4. Pressing 'n' in cursor mode on any buflists items will toggle the no_chanmon_like localvar of the buffer under the cursor
  5. Pressing 'h' in cursor mode on any buflists items will toggle the hidden property of the buffer under the cursor
  6. Pressing 'H' in cursor mode on any buflists items will toggle the view of the hidden buffers in the main buflist
  7. Pressing '1' in cursor mode on any buflists items will toggle the buflist_favorite_1 localvar of the buffer under the cursor
  8. Pressing '2' in cursor mode on any buflists items will toggle the buflist_favorite_2 localvar of the buffer under the cursor
  9. Pressing '3' in cursor mode on any buflists items will toggle the buflist_favorite_3 localvar of the buffer under the cursor
  10. Pressing 'ctrl-alt-wheelup' and 'ctrl-alt-wheeldown' on any buflists bars will scroll the buffer name of the buffer under the mouse
  11. Clicking with the left mouse button on the buflist3 item will change the active window to the one of the bar, change the buffer to the buffer under the mouse and change window back to the orignal one
  12. Dragging from any buflists items to a favorites bars will toggle the localvar with the same name as the bar for the buffer under the mouse
  13. Dragging any chats areas to a favorites bars will toggle the localvar with the same name as the bar for the buffer in the chat area
/set weechat.buffer.core.chanmon.localvar_set_buflist_favorite_2 1
/set weechat.buffer.core.highmon.localvar_set_buflist_favorite_2 1
/set weechat.buffer.core.newsmon.localvar_set_buflist_favorite_2 1

Add three buffers to the buflist_favorite_2 bar



buflist_favorite_3

WeeChat Screenshot

Dependencies:

  • WeeChat: 4.1.0
  • Plugins: buflist, trigger
  • Triggers: utils_search_server_buffer_ptr, utils_group_tools

/set buflist.look.use_items 4

we will use 4 buflist items

/set buflist.look.signals_refresh "irc_server_connected"

refresh the buflist for the irc_server_connected signal

/set buflist.look.display_conditions "${define:my_solution,buflist_${if:${bar_item.name}=~t$?main:favorite_${calc:${split:2,t,,${bar_item.name}}-1}}}${eval_cond:${plugins.var.group_tools.${my_solution}.buflist.look.display_conditions}}"
/set plugins.var.group_tools.buflist_favorite_3.buflist.look.display_conditions "${buffer.local_variables.buflist_favorite_3} !="

this is the conditions to know if a buffer should be included

/set buflist.format.buffer "${define:my_solution,buflist_${if:${bar_item.name}=~t$?main:favorite_${calc:${split:2,t,,${bar_item.name}}-1}}}${eval:${plugins.var.group_tools.${my_solution}.buflist.format.buffer}}"
/set buflist.format.buffer_current "${format_buffer}"
/set plugins.var.group_tools.buflist_favorite_3.buflist.format.buffer "${define:my_name,${if:${type}==server?${if:${plugins.var.group_tools.buflist_favorite_3.feature.real_net_name.enabled}!=&&${info:irc_server_isupport_value,${name},NETWORK}!=?${info:irc_server_isupport_value,${name},NETWORK}:${name}}:${name}}}${define:my_name_length,${lengthscr:${my_name}}}${define:my_name,${if:${buffer.local_variables.buflist_favorite_3_start_at}!=?${revscr:${cutscr:+${calc:${my_name_length}-${buffer.local_variables.buflist_favorite_3_start_at}},…,${revscr:${my_name}}}}:${my_name}}}${define:my_section,${if:${window.buffer}==${buffer}?active:inactive}}${define:my_opt_prefix,plugins.var.group_tools.buflist_favorite_3.tab.${my_section}}${define:my_tab_fg,${${my_opt_prefix}.fg}}${define:my_tab_bg,${${my_opt_prefix}.bg}}${define:my_tab_min,${${my_opt_prefix}.min}}${define:my_tab_max,${${my_opt_prefix}.max}}${define:my_tab_prefix,${${my_opt_prefix}.prefix}}${define:my_tab_suffix,${${my_opt_prefix}.suffix}}${define:my_name,${cutscr:+${if:${my_tab_max}==0?${calc:${lengthscr:${my_name}}+1}:${my_tab_max}},…,${my_name}}${repeat:${calc:${my_tab_min}-${lengthscr:${my_name}}}, }}${color:${my_tab_bg}}${my_tab_prefix}${color:${my_tab_fg},${my_tab_bg}} ${my_name} ${color:reset}${color:${my_tab_bg}}${my_tab_suffix}"

This was the formatting of the buffers that pass the conditions

/group_tools set buflist_favorite_3 feature real_net_name enabled 1
/group_tools add buflist_favorite_3 tab active fg "*white" bg "31" min "7" max "7" prefix "" suffix ""
/group_tools add buflist_favorite_3 tab inactive fg "*234" bg "24" min "7" max "7" prefix "" suffix ""
  1. Enable the real_net_name feature
  2. Set the apparence of the active tab
  3. Set the apparence of the inactive(s) tab(s)
/bar add buflist_favorite_3 window top 1 1 buflist4
/bar set buflist_favorite_3 priority 499
/bar set buflist_favorite_3 conditions ${window.number} == 3

add the buflist_favorite_3 bar

/trigger addreplace buflist_favorite_3_refresh config "plugins.var.group_tools.buflist_favorite_3.*" "" "" "/buflist refresh buflist4"

Refresh this buflist when one of its options changes

/key bindctxt cursor @item(buflist*):f /mute /toggle weechat.buffer.${plugin}.${if:${plugin}==irc||${buffer[${pointer}].local_variables.script_name}==matrix||${plugin}==matrix?server.}${localvar_server}.localvar_set_buflist_main_fold 1 '';/cursor stop
/key bindctxt cursor @item(buflist*):r /server raw c:\${${if:${localvar_type}==private?nick:${localvar_type}}}==${localvar_channel};/cursor stop
/key bindctxt cursor @item(buflist*):o /fset c:\${name}=*weechat.buffer.${full_name}.* ${if:${localvar_type}==server?|| \${name${\x7D}=*${full_name}.*};/cursor stop
/key bindctxt cursor @item(buflist*):n /mute /toggle weechat.buffer.${full_name}.localvar_set_no_chanmon_like 1 '';/cursor stop
/key bindctxt cursor @item(buflist*):h /mute /toggle weechat.buffer.${full_name}.hidden 1 '';/cursor stop
/key bindctxt cursor @item(buflist*):H /buflist_main toggle show_hidden_buffers;/cursor stop
/key bindctxt cursor @item(buflist*):1 /mute /toggle weechat.buffer.${full_name}.localvar_set_buflist_favorite_1 1'';/cursor stop
/key bindctxt cursor @item(buflist*):2 /mute /toggle weechat.buffer.${full_name}.localvar_set_buflist_favorite_2 1'';/cursor stop
/key bindctxt cursor @item(buflist*):3 /mute /toggle weechat.buffer.${full_name}.localvar_set_buflist_favorite_3 1'';/cursor stop
/key bindctxt mouse @bar(buflist_*):ctrl-alt-wheel* /mute /set weechat.buffer.${full_name}.localvar_set_${_bar_name}_start_at ${define:my_start_at,${buffer[${pointer}].local_variables.${_bar_name}_start_at}}${if:${_key}=~-wheelup$&&${my_start_at}==?0:${calc:${my_start_at}${if:${_key}=~up&&${my_start_at}!=?-:+}1}}
/key bindctxt mouse @item(buflist4):button1* /mute /set plugins.var.group_tools.${_bar_name}.monitor.window.previous ${window.number};/window ${_window_number};hsignal:buflist_mouse;/window ${plugins.var.group_tools.${_bar_name}.monitor.window.previous}
/key bindctxt mouse @item(buflist*)>bar(buflist_*):button1* /mute /toggle weechat.buffer.${full_name}.localvar_set_${_bar_name2} 1 ''
/key bindctxt mouse @chat(*)>bar(buflist_*):button1* /mute /toggle weechat.buffer.${_buffer_full_name}.localvar_set_${_bar_name2} 1 ''
  1. Pressing 'f' in cursor mode on any buflists items will toggle the folding of the server to which the buffer under the cursor belong
  2. Pressing 'r' in cursor mode on any buflists items will show the entries for the buffer under the cursor in the /server raw buffer
  3. Pressing 'o' in cursor mode on any buflists items will show the options for the buffer under the cursor in /fset
  4. Pressing 'n' in cursor mode on any buflists items will toggle the no_chanmon_like localvar of the buffer under the cursor
  5. Pressing 'h' in cursor mode on any buflists items will toggle the hidden property of the buffer under the cursor
  6. Pressing 'H' in cursor mode on any buflists items will toggle the view of the hidden buffers in the main buflist
  7. Pressing '1' in cursor mode on any buflists items will toggle the buflist_favorite_1 localvar of the buffer under the cursor
  8. Pressing '2' in cursor mode on any buflists items will toggle the buflist_favorite_2 localvar of the buffer under the cursor
  9. Pressing '3' in cursor mode on any buflists items will toggle the buflist_favorite_3 localvar of the buffer under the cursor
  10. Pressing 'ctrl-alt-wheelup' and 'ctrl-alt-wheeldown' on any buflists bars will scroll the buffer name of the buffer under the mouse
  11. Clicking with the left mouse button on the buflist4 item will change the active window to the one of the bar, change the buffer to the buffer under the mouse and change window back to the orignal one
  12. Dragging from any buflists items to a favorites bars will toggle the localvar with the same name as the bar for the buffer under the mouse
  13. Dragging any chats areas to a favorites bars will toggle the localvar with the same name as the bar for the buffer in the chat area
/set weechat.buffer.core.chanmon.localvar_set_buflist_favorite_3 1
/set weechat.buffer.core.highmon.localvar_set_buflist_favorite_3 1
/set weechat.buffer.core.newsmon.localvar_set_buflist_favorite_3 1

Add three buffers to the buflist_favorite_3 bar



Bars


titlenosep


/bar del title
/bar add titlenosep window top 1 0 #window_number ,buffer_title,spacer,newsmon_interest
/bar set titlenosep priority 500
/bar set titlenosep conditions ${window.number} =~ ^[23]$ 
/bar set titlenosep color_fg white
/bar set titlenosep color_delim white
/bar set titlenosep color_bg 31
/bar set titlenosep color_bg_inactive 31


titlesep


/bar add titlesep window top 1 1 #window_number ,buffer_title,spacer,newsmon_interest
/bar set titlesep priority 500
/bar set titlesep conditions ${window.number} !~ ^[23]$
/bar set titlesep color_fg white
/bar set titlesep color_delim white
/bar set titlesep color_bg 31
/bar set titlesep color_bg_inactive 31


status


/bar del status
/bar add status root bottom 1 0 time ,buffer_last_number ,buffer_plugin ,buffer_number+:+buffer_name+(buffer_modes)+{buffer_nicklist_count}+buffer_zoom+buffer_filter,,scroll ,lag ,typing ,completion ,spacer,sys_usage
/bar set status priority 500
/bar set status color_fg white
/bar set status color_delim 31
/bar set status color_bg 234


input


/bar add rootinput root bottom 0 0 [input_prompt]+(away),[input_search],[input_paste],input_text
/bar set rootinput priority 1000
/bar del input
/bar set rootinput name input


nicklist


/bar set nicklist color_fg 229
/bar set nicklist separator 1
/bar set nicklist conditions ${nicklist} && ${window.number} == 1
/bar set nicklist size_max 14
/bar set nicklist size 14


Monitors


chanmon

WeeChat Screenshot

Dependencies:

  • WeeChat: 4.1.0
  • Plugins: trigger
  • Triggers: utils_group_tools

/trigger addreplace chanmon_monitor print "*;irc_privmsg,matrix_message,matrix_text"
/trigger set chanmon_monitor conditions "${buffer.local_variables.type} == channel && ${buffer.local_variables.no_chanmon_like} == && (${plugins.var.group_tools.chanmon.feature.allow_filtered_lines.enabled} != || ${tg_displayed} !=) && (${plugins.var.group_tools.chanmon.feature.allow_hidden_channels.enabled} != || ${buffer.hidden} ==)"
/trigger set chanmon_monitor regex "/.*/${plugins.var.group_tools.chanmon.list.header.list}/my_list /[^,]+/${if:${re:0}=~^[abcdefghijklmnopqrstuvwxyz0-9_]+$?${re:0}}/my_list /[^,]+/plugins.var.group_tools.chanmon.segment.${re:0}/my_list /[^,]+/${if:${length:${${re:0}.conditions}}==||${eval_cond:${${re:0}.conditions}}?${re:0}}/my_list /,+/,/my_list /^,|,$//my_list /.*/${my_list}/my_bgs /[^,]+/${base_encode:16,${eval:${${re:0}.bg}}}/my_bgs /$/,${base_encode:16,default}/my_bgs /([^,]+)(,|$)/${define:my_fg,${eval:${${re:1}.fg}}}${define:my_bg,${base_decode:16,${split:${re:repl_index},,,${my_bgs}}}}${define:my_sep,${eval:${${re:1}.sep}}}${define:my_min,${eval:${${re:1}.min}}}${define:my_max,${eval:${${re:1}.max}}}${define:my_content,${eval:${${re:1}.content}}}${define:my_next_bg,${base_decode:16,${split:${calc:${re:repl_index}+1},,,${my_bgs}}}}${color:${my_fg},${my_bg}} ${cutscr:+${if:${split:1,0,keep_eol+strip_left,${my_max}}!~^[1-9][0-9]*$?${calc:${lengthscr:${my_content}}+1}:${my_max}},…,${my_content}}${repeat:${calc:${my_min}-${lengthscr:${my_content}}}, }${color:${my_fg},${my_bg}} ${if:${plugins.var.group_tools.chanmon.feature.powerline.enabled}!=?${if:${color:${my_bg}}==${color:${my_next_bg}}?${color:${my_sep}}:${color:${my_bg},${my_next_bg}}${color:reset}}:${color:reset} }/my_list /.+/${re:0} /my_list /.*/${tg_tags}/my_tags / //my_tags /.*/${my_list}${tg_message}/my_message"
/trigger set chanmon_monitor command "/print -newbuffer chanmon -tags ${my_tags} \t${my_message}"

this trigger create the chanmon monitor

/buffer add chanmon
/eval /set weechat.startup.command_after_plugins ${weechat.startup.command_after_plugins}${if:${weechat.startup.command_after_plugins}!=?;}/buffer add chanmon
/set weechat.buffer.core.chanmon.notify none
/set weechat.buffer.core.chanmon.highlight_words -
/set weechat.buffer.core.chanmon.title Channels Monitor
/set weechat.buffer.core.chanmon.time_for_each_line 0
/set weechat.buffer.core.chanmon.localvar_set_no_chanmon_like 1
/set weechat.buffer.irc.libera.##news.localvar_set_no_chanmon_like 1

the commands above set some buffer properties for our new monitor buffer

/group_tools set chanmon feature powerline enabled 1
/group_tools add chanmon segment date min "5" max "5" fg "white" bg "24" sep "24" content "${color:underline}${cut:5,,${split:-1,T ,,${tg_date}}}" conditions "${tg_highlight}=="
/group_tools add chanmon segment serv min "2" max "2" fg "white" bg "31" sep "24" content "${color:underline}${server}" conditions "${tg_highlight}=="
/group_tools add chanmon segment chan min "4" max "4" fg "white" bg "31" sep "24" content "${color:underline}${split:1,#,keep_eol+strip_left,${channel}}" conditions "${tg_highlight}=="
/group_tools add chanmon segment nick min "5" max "5" fg "white" bg "31" sep "24" content "${color:underline}${if:${tg_tags}=~,irc_action,?    *:${tg_tag_nick}}" conditions "${tg_highlight}=="
/group_tools add chanmon segment date_hl min "5" max "5" fg "white" bg "52" sep "52" content "${color:underline}${cut:5,,${split:-1,T ,,${tg_date}}}" conditions "${tg_highlight}!="
/group_tools add chanmon segment serv_hl min "2" max "2" fg "white" bg "124" sep "52" content "${color:underline}${server}" conditions "${tg_highlight}!="
/group_tools add chanmon segment chan_hl min "4" max "4" fg "white" bg "124" sep "52" content "${color:underline}${split:1,#,keep_eol+strip_left,${channel}}" conditions "${tg_highlight}!="
/group_tools add chanmon segment nick_hl min "5" max "5" fg "white" bg "124" sep "52" content "${color:underline}${if:${tg_tags}=~,irc_action,?    *:${tg_tag_nick}}" conditions "${tg_highlight}!="
/group_tools set chanmon list header list date,serv,chan,nick,date_hl,serv_hl,chan_hl,nick_hl

the commands above create a powerline bar to be displayed in front of the messages in the monitor buffer



highmon

WeeChat Screenshot

Dependencies:

  • WeeChat: 4.1.0
  • Plugins: trigger
  • Triggers: utils_group_tools

/trigger addreplace highmon_monitor print "*;irc_privmsg,matrix_message,matrix_text"
/trigger set highmon_monitor conditions "${tg_highlight} == 1 && ${buffer.local_variables.type} == channel && ${buffer.local_variables.no_highmon_like} == && (${plugins.var.group_tools.highmon.feature.allow_filtered_lines.enabled} != || ${tg_displayed} !=) && (${plugins.var.group_tools.highmon.feature.allow_hidden_channels.enabled} != || ${buffer.hidden} ==)"
/trigger set highmon_monitor regex "/.*/${plugins.var.group_tools.highmon.list.header.list}/my_list /[^,]+/${if:${re:0}=~^[abcdefghijklmnopqrstuvwxyz0-9_]+$?${re:0}}/my_list /[^,]+/plugins.var.group_tools.highmon.segment.${re:0}/my_list /[^,]+/${if:${length:${${re:0}.conditions}}==||${eval_cond:${${re:0}.conditions}}?${re:0}}/my_list /,+/,/my_list /^,|,$//my_list /.*/${my_list}/my_bgs /[^,]+/${base_encode:16,${eval:${${re:0}.bg}}}/my_bgs /$/,${base_encode:16,default}/my_bgs /([^,]+)(,|$)/${define:my_fg,${eval:${${re:1}.fg}}}${define:my_bg,${base_decode:16,${split:${re:repl_index},,,${my_bgs}}}}${define:my_sep,${eval:${${re:1}.sep}}}${define:my_min,${eval:${${re:1}.min}}}${define:my_max,${eval:${${re:1}.max}}}${define:my_content,${eval:${${re:1}.content}}}${define:my_next_bg,${base_decode:16,${split:${calc:${re:repl_index}+1},,,${my_bgs}}}}${color:${my_fg},${my_bg}} ${cutscr:+${if:${split:1,0,keep_eol+strip_left,${my_max}}!~^[1-9][0-9]*$?${calc:${lengthscr:${my_content}}+1}:${my_max}},…,${my_content}}${repeat:${calc:${my_min}-${lengthscr:${my_content}}}, }${color:${my_fg},${my_bg}} ${if:${plugins.var.group_tools.highmon.feature.powerline.enabled}!=?${if:${color:${my_bg}}==${color:${my_next_bg}}?${color:${my_sep}}:${color:${my_bg},${my_next_bg}}${color:reset}}:${color:reset} }/my_list /.+/${re:0} /my_list /.*/${tg_tags}/my_tags / //my_tags /.*/${my_list}${tg_message}/my_message"
/trigger set highmon_monitor command "/print -newbuffer highmon -tags ${my_tags} \t${my_message}"

this trigger create the highmon monitor

/buffer add highmon
/eval /set weechat.startup.command_after_plugins ${weechat.startup.command_after_plugins}${if:${weechat.startup.command_after_plugins}!=?;}/buffer add highmon
/set weechat.buffer.core.highmon.notify none
/set weechat.buffer.core.highmon.highlight_words -
/set weechat.buffer.core.highmon.title Highlight Monitor
/set weechat.buffer.core.highmon.time_for_each_line 0

the commands above set some buffer properties for our new monitor buffer

/group_tools set highmon feature powerline,allow_hidden_channels enabled 1
/group_tools add highmon segment date min "5" max "5" fg "white" bg "52" sep "52" content "${color:underline}${cut:5,,${split:-1,T ,,${tg_date}}}" conditions "${tg_highlight}!="
/group_tools add highmon segment serv min "2" max "2" fg "white" bg "124" sep "52" content "${color:underline}${server}" conditions "${tg_highlight}!="
/group_tools add highmon segment chan min "4" max "4" fg "white" bg "124" sep "52" content "${color:underline}${split:1,#,keep_eol+strip_left,${channel}}" conditions "${tg_highlight}!="
/group_tools add highmon segment nick min "5" max "5" fg "white" bg "124" sep "52" content "${color:underline}${if:${tg_tags}=~,irc_action,?    *:${tg_tag_nick}}" conditions "${tg_highlight}!="
/group_tools set highmon list header list date,serv,chan,nick

the commands above create a powerline bar to be displayed in front of the messages in the monitor buffer



newsmon

WeeChat Screenshot

Dependencies:

  • WeeChat: 4.1.0
  • Plugins: trigger
  • Triggers: utils_group_tools

/trigger addreplace newsmon_monitor print "irc.libera.##news;irc_privmsg,debug_newsmon"
/trigger set newsmon_monitor conditions "(${plugins.var.group_tools.newsmon.feature.allow_filtered_lines.enabled} != || ${tg_displayed} !=) && ${tg_message_nocolor} =~ ^\[[^]|]+\] +[^ ].* +→ +https?://[^ ]+$"
/trigger set newsmon_monitor regex "/.*/${info:newsmon_parse,site_and_sections,${tg_message_nocolor}}/my_site_and_sections /.*/${split:1,|,,${my_site_and_sections}}/my_site /.*/${split:2,|,,${my_site_and_sections}}/my_first_section /.*/${split:3,|,,${my_site_and_sections}}/my_second_section /.*/${info:newsmon_parse,title,${tg_message_nocolor}}/my_title /.*/${info:newsmon_parse,url,${tg_message_nocolor}}/my_url /.*/${plugins.var.group_tools.newsmon.list.header.list}/my_list /[^,]+/${if:${re:0}=~^[abcdefghijklmnopqrstuvwxyz0-9_]+$?${re:0}}/my_list /[^,]+/plugins.var.group_tools.newsmon.segment.${re:0}/my_list /[^,]+/${if:${length:${${re:0}.conditions}}==||${eval_cond:${${re:0}.conditions}}?${re:0}}/my_list /,+/,/my_list /^,|,$//my_list /.*/${my_list}/my_bgs /[^,]+/${base_encode:16,${eval:${${re:0}.bg}}}/my_bgs /$/,${base_encode:16,default}/my_bgs /([^,]+)(,|$)/${define:my_fg,${eval:${${re:1}.fg}}}${define:my_bg,${base_decode:16,${split:${re:repl_index},,,${my_bgs}}}}${define:my_sep,${eval:${${re:1}.sep}}}${define:my_min,${eval:${${re:1}.min}}}${define:my_max,${eval:${${re:1}.max}}}${define:my_content,${eval:${${re:1}.content}}}${define:my_next_bg,${base_decode:16,${split:${calc:${re:repl_index}+1},,,${my_bgs}}}}${color:${my_fg},${my_bg}} ${cutscr:+${if:${split:1,0,keep_eol+strip_left,${my_max}}!~^[1-9][0-9]*$?${calc:${lengthscr:${my_content}}+1}:${my_max}},…,${my_content}}${repeat:${calc:${my_min}-${lengthscr:${my_content}}}, }${color:${my_fg},${my_bg}} ${if:${plugins.var.group_tools.newsmon.feature.powerline.enabled}!=?${if:${color:${my_bg}}==${color:${my_next_bg}}?${color:${my_sep}}:${color:${my_bg},${my_next_bg}}${color:reset}}:${color:reset} }/my_list /.+/${re:0} /my_list /.*/${tg_tags}/my_tags / //my_tags /.*/${my_list}${my_title}${if:${plugins.var.group_tools.newsmon.feature.keep_url.enabled}!=? → ${my_url}}/my_message"
/trigger set newsmon_monitor command "/print -newbuffer newsmon -tags ${my_tags} \t${my_message}"

this trigger create the newsmon monitor

/trigger addreplace newsmon_article_parse info "newsmon_parse"
/trigger set newsmon_article_parse regex "/.*/${split:1,,,${tg_arguments}}/my_var /.*/${split:2,,keep_eol,${tg_arguments}}/my_message /.*/${my_message}/my_site_and_sections /.*/${my_message}/my_title /^\[([^]]+)\].*/${re:1}/my_site_and_sections / - /|/my_site_and_sections /^\[[^]]+\] (.*)/${re:1}/my_title /.*/${split:-1, ,,${my_title}}/my_url / [^ ]+ [^ ]+$//my_title /.*/${my_${my_var}}/tg_info"

this trigger is the article parser

/trigger addreplace newsmon_article_tags_insert line "formatted;irc.libera.##news;irc_privmsg,debug_newsmon"
/trigger set newsmon_article_tags_insert conditions "${tg_message_nocolor} =~ ^\[[^]|]+\] +[^ ].* +→ +https?://[^ ]+$"
/trigger set newsmon_article_tags_insert regex "/.*/${lower:${info:newsmon_parse,site_and_sections,${tg_message_nocolor}}}/my_site_and_sections /.*/site_name,site_first_section,site_second_section/my_news_tags /[^,]+/${re:0}_${base_encode:16,${split:${re:repl_index},|,,${my_site_and_sections}}}/my_news_tags /$/${my_news_tags},/tags /\|/ - /my_site_and_sections /$/site_and_sections_${base_encode:16,${my_site_and_sections}},site_title_${base_encode:16,${lower:${info:newsmon_parse,title,${tg_message_nocolor}}}},site_url_${base_encode:16,${info:newsmon_parse,url,${tg_message_nocolor}}},/tags"

this trigger appends the site_* tags to the article on the source buffer (by default irc.libera.##news)

/trigger addreplace newsmon_filter_rebuild command "newsmon_filter_rebuild;rebuild the news or newsmon filter;<list>;list: a list (news or newsmon)"
/trigger set newsmon_filter_rebuild conditions "${tg_argv_eol1} =~ ^news(mon)?$"
/trigger set newsmon_filter_rebuild regex "/.*/${tg_argv1}/my_list /.*/${raw:${${my_opt}_name},${${my_opt}_first_section},${${my_opt}_second_section},${${my_opt}_and_sections},${${my_opt}_name_start_with},${${my_opt}_first_section_start_with},${${my_opt}_second_section_start_with},${${my_opt}_and_sections_start_with},${${my_opt}_name_end_with},${${my_opt}_first_section_end_with},${${my_opt}_second_section_end_with},${${my_opt}_and_sections_end_with},${${my_opt}_name_contain},${${my_opt}_first_section_contain},${${my_opt}_second_section_contain},${${my_opt}_and_sections_contain},${${my_opt}_title},${${my_opt}_title_start_with},${${my_opt}_title_end_with},${${my_opt}_title_contain}}/my_options /.*/${plugins.var.group_tools.newsmon_interest.list.${my_list}.list}/my_interests /[^,]+/${if:${re:0}=~^[abcdefghijklmnopqrstuvwxyz0-9_]+$?${re:0}}/my_interests /,+/,/my_interests /^,|,$//my_interests /.*/${my_interests}/my_no_site_tags /([^,]+),?/${define:my_opt,plugins.var.group_tools.newsmon_interest.category.${re:1}.tags_no_site}${eval:${my_options}},/my_no_site_tags /,+/,/my_no_site_tags /^,|,$//my_no_site_tags /.*/${my_interests}/my_site_tags /,/+/my_options /([^,]+),?/${define:my_opt,plugins.var.group_tools.newsmon_interest.category.${re:1}.tags_site}${eval:${my_options}}+/my_site_tags /[+]+/+/my_site_tags /^[+]|[+]$//my_site_tags /.*/${my_no_site_tags},${my_site_tags}/my_tags /^,|,$//my_tags /^$/!hide_everything/my_tags /.*/${if:${my_list}==newsmon?core.newsmon:irc.libera.##news}/my_buffer"
/trigger set newsmon_filter_rebuild command "/mute -core /filter addreplace ${my_list}_interest ${my_buffer} ${my_tags} *"

this trigger recreate the filters for the source buffer (irc.libera.##news) and the destination buffer (core.newsmon)

/trigger addreplace newsmon_filter_tags_rebuild config "plugins.var.group_tools.newsmon_interest.category.*"
/trigger set newsmon_filter_tags_rebuild conditions "${split:6,.,,${tg_option}} =~ ^[abcdefghijklmnopqrstuvwxyz0-9_]+$ && ${split:7,.,,${tg_option}} =~ ^(no_)?site_(name|first_section|second_section|and_sections|title)(_start_with|_end_with|_contain)?$"
/trigger set newsmon_filter_tags_rebuild regex "/.*/${split:6,.,,${tg_option}}/my_category /.*/${split:7,.,,${tg_option}}/my_property /.*/${my_property}/my_tag_prefix /^no_//my_tag_prefix /_(contain|start_with|end_with)$//my_tag_prefix /.*/${lower:${tg_value}}/my_tags /[^|]+/${if:${my_property}=~(end_with|contain)$?*}${base_encode:16,${re:0}}${if:${my_property}=~(start_with|contain)$?*}/my_tags /\|+/|/my_tags /^\||\|$//my_tags /.+/${if:${my_property}!~^no_?!}${my_tag_prefix}_${re:0}/my_tags /\|/${if:${my_property}=~^no_?,:+!}${my_tag_prefix}_/my_tags"
/trigger set newsmon_filter_tags_rebuild command "/set plugins.var.group_tools.newsmon_interest.category.${my_category}.tags_${my_property} '${my_tags}'"

this trigger recreate the tags option of an option

/trigger addreplace newsmon_item_rebuild config "plugins.var.group_tools.newsmon_interest.list.all.list;plugins.var.group_tools.newsmon_interest.list.newsmon.list"
/trigger set newsmon_item_rebuild regex "/.*/${plugins.var.group_tools.newsmon_interest.list.all.list}/my_content /[^,]+/${if:${re:0}=~^[abcdefghijklmnopqrstuvwxyz0-9_]+$?${re:0}}/my_content /,+/,/my_content /^,|,$//my_content /([^,]+),?/${define:my_display,${plugins.var.group_tools.newsmon_interest.category.${re:1}.display}}${define:my_display,${if:${length:${my_display}}==?${re:1}:${my_display}}}${define:my_color,${if:,${plugins.var.group_tools.newsmon_interest.list.newsmon.list},=-,${re:1},?45:24}}${color:${my_color}}${color:darkgray,${my_color}}${cutscr:+5,…,${my_display}}${color:reset}${color:${my_color}}\n/my_content /.*/${base_encode:16,${my_content}}/my_item"
/trigger set newsmon_item_rebuild command "/mute -core /set plugins.var.group_tools.newsmon_interest.item.newsmon_interest.encoded '${my_item}';/item refresh newsmon_interest"

this trigger rebuild the bar item newsmon_interest

/trigger addreplace newsmon_interest_list command "newsmon_interest_list;manage the list of active categories (news and newsmon) and the list of all categories (all);push|push_if_not|remove|content <list> <category> [<category>...];       push: put one or more categories at the end of a list${\n}push_if_not: put one or more categories at the end of a list if not already in the list${\n}     remove: remove one or more categories in a list${\n}    content: replace a list${\n}       list: a list (news, newsmon or all)${\n}   category: name of a category${\n}${\n}Put a category at the end of the newsmon list only if this category is not already part of the list:${\n}${\n}   /${tg_trigger_name} push_if_not newsmon tech${\n}${\n}Remove a category from the newsmon list:${\n}${\n}   /${tg_trigger_name} remove newsmon tech;content|push|push_if_not|remove"
/trigger set newsmon_interest_list conditions "${tg_argv_eol1} =~ (?-i)^(content|push|push_if_not|remove) +(news|newsmon|all) +([abcdefghijklmnopqrstuvwxyz0-9_]+ *)+$"
/trigger set newsmon_interest_list regex "/.*/${tg_argv1}/my_action /.*/${tg_argv2}/my_list_name /.*/plugins.var.group_tools.newsmon_interest.list.${my_list_name}.list/my_list_opt /.*/${${my_list_opt}}/my_list /[^,]+/${if:${re:0}=~^[abcdefghijklmnopqrstuvwxyz0-9_]+$?${re:0}}/my_list /.*/${tg_argv_eol3}/my_categories / +/,/my_categories /.*/${if:${my_action}==push_if_not?${my_categories}}/my_push_if_not_categories /[^,]+/${if:,${my_list},!-,${re:0},&&,${split:${calc:${re:repl_index}+1},,keep_eol,${my_categories}},!-,${re:0},?${re:0}}/my_push_if_not_categories /.*/${if:${my_action}==remove?${my_list}}/my_remove_categories /[^,]+/${if:,${my_categories},!-,${re:0},?${re:0}}/my_remove_categories /.*/${if:${my_action}==push_if_not?${my_push_if_not_categories}:${if:${my_action}==remove?${my_remove_categories}:${re:0}}}/my_categories /.*/${if:${my_action}=~^push?${re:0},}${my_categories}/my_list /,+/,/my_list /^,|,$//my_list ===.*===/mute -core /set ${my_list_opt} '${my_list}'===my_cmds_to_run ===$===${if:${my_list_name}=~^news?;/newsmon_filter_rebuild ${my_list_name}}===my_cmds_to_run" 
/trigger set newsmon_interest_list command "/command -buffer core.weechat * /eval -s ${my_cmds_to_run}"

/trigger addreplace newsmon_interest command "newsmon_interest;manage your newsmon's interests;add <category> ${\x22}<property>${\x22} ${\x22}<value>${\x22} [${\x22}<property>${\x22} ${\x22}<value>${\x22}...] || del|enable|disable <category> [<category>...];     add: add or change a category${\n}     del: delete one or more categories${\n}  enable: enable some categories${\n} disable: disable some categories${\n}category: name of a category${\n}  property: (no_)?site_(name|first_section|second_section|and_sections|title)(_contain|_start_with|_end_with)?${\n}   value: a list of sites attributes separated by pipe${\n}${\n}-----${\n}${\n}Here is the format of an article:${\n}${\n}    ${color:white,31} site_name  first_section  second_section ${color:31,default}${color:reset} article_title → article_url${\n}${\n}Not every articles have a first or second section.${\n}${\n}-----${\n}${\n}Examples of articles:${\n}${\n}    ${color:white,13} Phoronix ${color:13,default}${color:reset} Hardware Timestamping... → https://www.phoronix.com/...${\n}    ${color:white,130} Science Daily  all ${color:130,default}${color:reset} How glyphosate... → https://www.sciencedaily.com/...${\n}${\n}-----${\n}${\n}Create a tech category matching ${color:underline}exactly${color:-underline} the site ${color:bold}Phoronix${color:-bold} and ${color:bold}Ars Technica${color:-bold} in addition to all articles with a first section ${color:underline}containing${color:-underline} ${color:bold}tech${color:-bold}:${\n}${\n}${color:121}    /newsmon_interest add tech ${\x22}site_name${\x22} ${\x22}Phoronix|Ars Technica${\x22} ${\x22}site_first_section_contain${\x22} ${\x22}tech${\x22}${\n}${\n}Create a Canada category ${color:underline}containing${color:-underline} ${color:bold}Canada${color:-bold} in their site name, site first section, site second section or articles title:${\n}${\n}${color:121}    /newsmon_interest add canada ${\x22}site_and_sections_contain${\x22} ${\x22}Canada${\x22} ${\x22}site_title_contain${\x22} ${\x22}Canada${\x22}${\n}${\n}In the previous examples, notice how the properties and values are surrounded by ${\x22}${\x22}. You ${color:bold}must${color:-bold} use those if one of those contains a space but it is recommended to err on the side of caution and always use them.${\n}${\n}-----${\n}${\n}You can obtain the list of sites by visiting the URL in the topic of the ##news-chat channel on libera;add|del|enable|disable"
/trigger set newsmon_interest conditions "${tg_argv_eol1} =~ (?-i)^add +[abcdefghijklmnopqrstuvwxyz0-9_]+ . || ${tg_argv_eol1} =~ (?-i)^(del|enable|disable) +([abcdefghijklmnopqrstuvwxyz0-9_]+ *)+$"
/trigger set newsmon_interest regex "/.*/${tg_argv1}/my_action /.*/${if:${my_action}==add?${tg_argv2}:${tg_argv_eol2}}/my_categories / +/ /my_categories /.*/${if:${my_action}=~^(add|enable)$?push_if_not:remove}/my_list_action /.*/${if:${my_action}=~^(add|del)$?all,news,}newsmon/my_lists /.*/${if:${my_action}==add?${repeat:${calc:${tg_shell_argc}-3},,}}/my_add_cmds /,/${if:${re:repl_index}=~[13579]$&&${tg_shell_argv${calc:${re:repl_index}+2}}=~^[abcdefghijklmnopqrstuvwxyz0-9_]+$?${calc:${re:repl_index}+2},}/my_add_cmds ===([^,]+),===${define:my_property,${tg_shell_argv${re:1}}}${define:my_value,${tg_shell_argv${calc:${re:1}+1}}}/mute -core /set plugins.var.group_tools.newsmon_interest.category.${my_categories}.${my_property} '\${base_decode:16,${base_encode:16,${my_value}}}';===my_add_cmds /.*/${if:${my_action}==del?${my_categories}}/my_del_cmds ===([^ ]+) ?===/mute -core /unset -mask plugins.var.group_tools.newsmon_interest.category.${re:1}.*;===my_del_cmds /.*/${my_lists}/my_list_cmds ===([^,]+),?===/newsmon_interest_list ${my_list_action} ${re:1} ${my_categories};===my_list_cmds /.*/${my_add_cmds}${my_del_cmds}${my_list_cmds}/my_cmds_to_run"
/trigger set newsmon_interest command "/command -buffer core.weechat * /eval -s ${my_cmds_to_run}"

/trigger addreplace newsmon_item_click hsignal "newsmon_item_click"
/trigger set newsmon_item_click regex "/.*/${plugins.var.group_tools.newsmon_interest.list.all.list}/my_list /[^,]+/${if:${re:0}=~^[abcdefghijklmnopqrstuvwxyz0-9_]+$?${re:0}}/my_list /[^,]+/${if:${calc:${re:repl_index}-1}==${_bar_item_line}?${re:0}}/my_list /,//my_list /.*/${my_list}/my_category /.*/${if:${_key}==button1?content:${if:,${plugins.var.group_tools.newsmon_interest.list.newsmon.list},=-,${my_category},?remove:push}}/my_action"
/trigger set newsmon_item_click command "/newsmon_interest_list ${my_action} newsmon ${my_category}"

/key bindctxt mouse @item(newsmon_interest):button1* hsignal:newsmon_item_click
/key bindctxt mouse @item(newsmon_interest):button2* hsignal:newsmon_item_click

this trigger and these binds allows you to enable or disable categories by clicking on them in the newsmon bar item

/trigger addreplace newsmon_article_click hsignal "newsmon_article_click"
/trigger set newsmon_article_click regex "/.*/${_chat_line_tags}/my_article_url /[^,]+/${if:${re:0}=~^site_url_[[:xdigit:]]+$?${re:0}}/my_article_url /site_url_//my_article_url /,//my_article_url /.*/${base_decode:16,${re:0}}/my_article_url"
/trigger set newsmon_article_click command "/command -buffer ${buffer.full_name} core /input insert ${my_article_url}\x20"

/key bindctxt cursor @chat(core.newsmon):i hsignal:newsmon_article_click;/cursor stop

this trigger and this bind allows you to get the URL of an article from the tags when you press 'i' in cursor mode on an article

/buffer add newsmon
/eval /set weechat.startup.command_after_plugins ${weechat.startup.command_after_plugins}${if:${weechat.startup.command_after_plugins}!=?;}/buffer add newsmon
/set weechat.buffer.core.newsmon.notify none
/set weechat.buffer.core.newsmon.highlight_words -
/set weechat.buffer.core.newsmon.title News Monitor
/set weechat.buffer.core.newsmon.time_for_each_line 0
/set weechat.buffer.irc.libera.##news.notify none
/set weechat.buffer.irc.libera.##news.hidden 1

the commands above set some buffer properties for our new monitor buffer

/item addreplace newsmon_interest "${buffer.full_name} == core.newsmon" "${base_decode:16,${plugins.var.group_tools.newsmon_interest.item.newsmon_interest.encoded}}"

the command above create a new bar item

/group_tools set newsmon all general colors 1,3,4,5,6,9,10,13,17,22,23,25,27,33,53,55,57,63,93,94,124,129,130
/group_tools set newsmon feature powerline enabled 1
/group_tools add newsmon segment site_name min "0" max "${calc:10+${if:${lengthscr:${my_first_section}}==?4:${if:${lengthscr:${my_first_section}}<7?7-${lengthscr:${my_first_section}}}}}" fg "white" bg "${info:nick_color_name,${base_encode:16,${my_site_and_sections}};${plugins.var.group_tools.newsmon.all.general.colors}}" sep "white" content "${color:underline}${my_site}"
/group_tools add newsmon segment site_first_section min "0" max "${calc:7+${if:${lengthscr:${my_site}}<10?10-${lengthscr:${my_site}}}}" fg "white" bg "${info:nick_color_name,${base_encode:16,${my_site_and_sections}};${plugins.var.group_tools.newsmon.all.general.colors}}" sep "white" content "${color:underline}${my_first_section}" conditions "${my_first_section}!="
/group_tools add newsmon segment site_no_first_section min "0" max "${calc:7+${if:${lengthscr:${my_site}}<10?10-${lengthscr:${my_site}}}}" fg "white" bg "${info:nick_color_name,${base_encode:16,${my_site_and_sections}};${plugins.var.group_tools.newsmon.all.general.colors}}" sep "white" content "${color:underline}N/A" conditions "${my_first_section}=="
/group_tools set newsmon list header list site_name,site_first_section,site_no_first_section

the commands above create a powerline bar to be displayed in front of the messages in the monitor buffer

/newsmon_interest add tech "display" "💻" "site_name" "Wired|EFF Updates|techdirt|TorrentFreak|Hacker News|CNET|phoronix|Ars Technica|Journal du hacker" "site_and_sections_contain" "netsec|Tech" "site_title_contain" "Linux|Computer|Techno"
/newsmon_interest add science "display" "🧪" "site_and_sections_contain" "Science|Space|Environment" "site_title_contain" "Study|Climate"
/newsmon_interest add canada "display" "🇨🇦" "site_and_sections_contain" "Canada|Quebec|Montreal" "site_title_contain" "Canada|Quebec|Montreal" 
/newsmon_interest add world "display" "🌐" "site_and_sections_contain" "World|International"
/newsmon_interest add health "display" "🏥" "site_and_sections_contain" "Health" "site_title_contain" "Health"
/newsmon_interest add finance "display" "💲" "site_and_sections_contain" "Finance|Business|Money|Company|Economy"
/newsmon_interest add hockey "display" "🏒" "site_title_contain" "NHL|Hockey"
/newsmon_interest add life "display" "🙂" "site_and_sections_contain" "Life|People|Culture|Music|Film|Religion|Art"


Layouts


main_monitor_1


/eval /window splith ${calc:9 / ${window[gui_current_window].win_height} * 100 // 1}
/buffer highmon
/window 1
/layout store main-monitor1 windows


main_monitor_1_monitor_2


/window 2
/window splitv 50
/buffer core.newsmon
/window 1
/layout store main-monitor1-monitor2 windows


Misc


new_logo

WeeChat Screenshot

Dependencies:

  • WeeChat: 3.6
  • Plugins: trigger

/item addreplace new_logo_weechat_logo "" "${define:my_green,34}${define:my_blue,27}${define:my_left_margin,${repeat:${calc:(${weechat.bar.buflist.size}-13)//2}, }}${my_left_margin}${color:${my_green}}${color:,${my_green}}            ${color:reset}${\n}${my_left_margin}${color:${my_green}}▀▀▀  ${color:${my_blue}}▄▄▄  ▄▄▄${\n}${my_left_margin}${color:${my_blue}}▇▇▇  ${color:${my_blue},${my_blue}}   ${color:reset}  ${color:${my_blue},${my_blue}}   ${color:reset}${\n}${my_left_margin}${color:${my_blue},${my_blue}}   ${color:reset}  ${color:${my_blue},${my_blue}}   ${color:reset}  ${color:${my_blue},${my_blue}}   ${color:reset}${\n}${my_left_margin}${color:${my_blue}}${color:,${my_blue}}            ${color:reset}"
/item addreplace new_logo_empty_line "" " "
/item addreplace new_logo_separator "" "${color:31}${repeat:${weechat.bar.buflist.size},─}"
/item addreplace new_logo_weechat_version "" "${repeat:${calc:(${weechat.bar.buflist.size}-${length:${info:version}})//2}, }${color:*white}${info:version}"

add four items: the logo itself, an empty line, a separator and the weechat version

/bar set buflist items new_logo_empty_line,new_logo_weechat_logo,new_logo_empty_line,new_logo_weechat_version,new_logo_separator,buflist

add these items to the buflist bar just before the buflist item

/trigger addreplace new_logo_refresh config "weechat.bar.buflist.size" "" "" "/item refresh new_logo_weechat_logo;/item refresh new_logo_weechat_version;/item refresh new_logo_separator"

refresh the items when the buflist is resized (to center them)



sys_usage

WeeChat Screenshot

Dependencies:

  • WeeChat: 3.6
  • Plugins: python, trigger
  • PythonLib: psutil
  • Triggers: utils_group_tools

/item addreplace sys_usage "" "${base_decode:16,${plugins.var.group_tools.sys_usage.item.sys_usage.encoded}}"

create a bar item

/trigger addreplace sys_usage_item_rebuild timer "1000;0;0"
/trigger set sys_usage_item_rebuild regex "/.*/${plugins.var.group_tools.sys_usage.list.sys_usage.list}/my_content /[^,]+/${if:${re:0}=~^[abcdefghijklmnopqrstuvwxyz0-9_]+$?${re:0}}/my_content /,+/,/my_content /^,|,$//my_content /([^,]+),?/${eval:${color:bar_delim}${plugins.var.group_tools.sys_usage.all.general.separator} ${color:reset}${plugins.var.group_tools.sys_usage.component.${re:1}.display} ${color:reset}${plugins.var.group_tools.sys_usage.component.${re:1}.content}}\n/my_content /.*/${base_encode:16,${my_content}}/my_item"
/trigger set sys_usage_item_rebuild command "/mute -core /set plugins.var.group_tools.sys_usage.item.sys_usage.encoded '${my_item}';/item refresh sys_usage"

this trigger create a timer to refresh the sys_item item

/group_tools set sys_usage all general separator 
/group_tools add sys_usage component cpu display "${color:24}▣" content "${define:my_cpu_percent,${info:python_eval,import psutil;print(psutil.cpu_percent(interval=0.0,percpu=False))}}${if:${length:${my_cpu_percent}}==3? }${my_cpu_percent}${color:246}%"
/group_tools add sys_usage component mem display "${color:24}▬▬" content "${define:my_mem_percent,${info:python_eval,import psutil;print(psutil.virtual_memory().percent)}}${if:${length:${my_mem_percent}}==3? }${my_mem_percent}${color:246}%"
/group_tools add sys_usage component swap display "${color:24}⎘" content "${define:my_swap_percent,${info:python_eval,import psutil;print(psutil.swap_memory().percent)}}${if:${length:${my_swap_percent}}==3? }${my_swap_percent}${color:246}%"
/group_tools set sys_usage list sys_usage list cpu,mem,swap

create and enable three components (cpu, ram and swap)



conf_parser

WeeChat Screenshot

Dependencies:

  • WeeChat: 4.3.0
  • Plugins: exec, trigger
  • Programs: sed

/trigger addreplace conf_parser_index_rebuild hsignal "conf_parser_index_rebuild"
/trigger set conf_parser_index_rebuild conditions "${out} =~ ^(## +[abcdefghijklmnopqrstuvwxyz0-9_]+ *${\n}(### +[abcdefghijklmnopqrstuvwxyz0-9_]+ *${\n})+)+$"
/trigger set conf_parser_index_rebuild regex "/.*/${out}/my_index /\n//my_index /### +/;###/my_index /## +/,##/my_index /^,//my_index /((^|,)[^;]+);([^,]+)/${re:1}+0;${re:3}/my_index"
/trigger set conf_parser_index_rebuild command "/mute -core /set plugins.var.group_tools.conf_parser.misc.index.content '${my_index}';/command -buffer core.weechat trigger /conf_parser_items_rebuild"

The conf_parser_index_rebuild trigger is used to rebuild the index (the list of sections and subsections of this config)

/trigger addreplace conf_parser_items_rebuild command "conf_parser_items_rebuild;this command rebuild both items (conf_parser_item_line and conf_parser_item_index)"
/trigger set conf_parser_items_rebuild conditions "${plugins.var.group_tools.conf_parser.misc.index.content} =~ ^(##[abcdefghijklmnopqrstuvwxyz0-9_]+\+[01](;###[abcdefghijklmnopqrstuvwxyz0-9_]+)+,)*##[abcdefghijklmnopqrstuvwxyz0-9_]+\+[01](;###[abcdefghijklmnopqrstuvwxyz0-9_]+)+$"
/trigger set conf_parser_items_rebuild regex "/.*/,${plugins.var.group_tools.conf_parser.misc.index.content}/my_last_section /(\+0);[^,]+/${re:1}/my_last_section /.*/${my_last_section}/my_others_sections /.*(,[^,]+)$/${re:1}/my_last_section /(.*),[^,]+$/${re:1}/my_others_sections /###([a-z0-9_]+)(,|$)/│ └─ ${re:1}${re:2}/my_others_sections /###/│ ├─ /my_others_sections /##([a-z0-9_]+)\+([01])/├─${if:${re:2}==1?⊟:⊞} ${re:1}/my_others_sections /###([a-z0-9_]+)(,|$)/  └─ ${re:1}${re:2}/my_last_section /###/  ├─ /my_last_section /##([a-z0-9_]+)\+([01])/└─${if:${re:2}==1?⊟:⊞} ${re:1}/my_last_section /.*/⊟ Config${my_others_sections}${my_last_section}/my_item_index_content /;/,/my_item_index_content /.*/${calc:${split:count,,,${my_item_index_content}}-1}/my_total /.*/${repeat:${my_total},,}/my_item_line_content /,/${repeat:${calc:${length:${my_total}}-${length:${re:repl_index}}}, }${re:repl_index}.${raw:${\x5cn}}/my_item_line_content /.*/${repeat:${calc:${length:${my_total}}-${length:${re:repl_index}}}, }0.${raw:${\x5cn}}${re:0}/my_item_line_content /,/${raw:${\x5cn}}/my_item_index_content /.*/${if:${plugins.var.group_tools.conf_parser.index.config.collapsed}==?${my_item_line_content}:${repeat:${calc:${length:${my_total}}-${length:${re:repl_index}}}, }0.}/my_item_line_content /.*/${if:${plugins.var.group_tools.conf_parser.index.config.collapsed}==?${my_item_index_content}:⊞ Config}/my_item_index_content"
/trigger set conf_parser_items_rebuild command "/mute -core /item addreplace conf_parser_item_line '' '${my_item_line_content}';/mute -core /item addreplace conf_parser_item_index '' '${my_item_index_content}'"

the conf_parser_items_rebuild is used to rebuild both items (conf_parser_item_line and conf_parser_item_index) each time we toggle config, toggle a section or rebuild the index

/trigger addreplace conf_parser_input modifier "input_text_for_buffer"
/trigger set conf_parser_input conditions "${plugins.var.group_tools.conf_parser.misc.index.content} =~ ^(##[abcdefghijklmnopqrstuvwxyz0-9_]+\+[01](;###[abcdefghijklmnopqrstuvwxyz0-9_]+)+,)*##[abcdefghijklmnopqrstuvwxyz0-9_]+\+[01](;###[abcdefghijklmnopqrstuvwxyz0-9_]+)+$ && ${buffer[${tg_modifier_data}].full_name} == exec.exec.conf_parser && ${tg_string_nocolor} =~ (?-i)^[rst] +[0-9]+( +[abcdefghijklmnopqrstuvwxyz0-9_]*)?$"
/trigger set conf_parser_input regex "/.*/${split:1, ,collapse_seps,${tg_string_nocolor}}/my_action /./${if:${re:0}==r?run:${if:${re:0}==s?show:toggle}}/my_action /.*/${split:2, ,collapse_seps,${tg_string_nocolor}}/my_line_number /.*/${plugins.var.group_tools.conf_parser.misc.index.content}/my_lines /(\+0);[^,]+/${re:1}/my_lines /;/,/my_lines /.*/${split:${my_line_number},,,${my_lines}}/my_line_content /.*/${if:${my_line_number}==0?config:${if:${my_line_content}!-+?subsection:section}/my_type /.*/${if:${my_type}==subsection&&${my_action}==toggle?show:${re:0}}/my_action /.*/${split:3, ,collapse_seps,${tg_string_nocolor}}/my_extra_arg /.*//tg_string"
/trigger set conf_parser_input command "/command -buffer core.weechat trigger /conf_parser_${my_type}_${my_action} ${my_line_number} ${my_extra_arg}"

the trigger conf_parser_input is used to deal with the input provided by the user. The user can send a 'r' to run the code in config/a section/a subsection, 's' to show the code in config/a section/a subsection or 't' to toggle config or a section

/trigger addreplace conf_parser_item_line_click hsignal "conf_parser_item_line_click"
/trigger set conf_parser_item_line_click conditions "${plugins.var.group_tools.conf_parser.misc.index.content} =~ ^(##[abcdefghijklmnopqrstuvwxyz0-9_]+\+[01](;###[abcdefghijklmnopqrstuvwxyz0-9_]+)+,)*##[abcdefghijklmnopqrstuvwxyz0-9_]+\+[01](;###[abcdefghijklmnopqrstuvwxyz0-9_]+)+$"
/trigger set conf_parser_item_line_click regex "/.*/${plugins.var.group_tools.conf_parser.misc.index.content}/my_lines /(\+0);[^,]+/${re:1}/my_lines /;/,/my_lines /.*/${split:${_bar_item_line},,,${my_lines}}/my_line_content /.*/${if:${_bar_item_line}==0?config:${if:${my_line_content}!-+?subsection:section}/my_type"
/trigger set conf_parser_item_line_click command "/command -buffer core.weechat trigger /conf_parser_${my_type}_show ${_bar_item_line}"

the trigger conf_parser_item_line_click is used to deal with mouse click on the conf_parser_item_line item. It just send a show command to show the content of config/that section or that subsection

/trigger addreplace conf_parser_item_index_click hsignal "conf_parser_item_index_click"
/trigger set conf_parser_item_index_click conditions "${plugins.var.group_tools.conf_parser.misc.index.content} =~ ^(##[abcdefghijklmnopqrstuvwxyz0-9_]+\+[01](;###[abcdefghijklmnopqrstuvwxyz0-9_]+)+,)*##[abcdefghijklmnopqrstuvwxyz0-9_]+\+[01](;###[abcdefghijklmnopqrstuvwxyz0-9_]+)+$"
/trigger set conf_parser_item_index_click regex "/.*/${plugins.var.group_tools.conf_parser.misc.index.content}/my_lines /(\+0);[^,]+/${re:1}/my_lines /;/,/my_lines /.*/${split:${_bar_item_line},,,${my_lines}}/my_line_content /.*/${if:${_bar_item_line}==0?config:${if:${my_line_content}!-+?subsection:section}/my_type /.*/${if:${my_type}==config?${if:${_bar_item_col}==0?toggle:show}:${if:${my_type}==section?${if:${_bar_item_col}==2?toggle:show}:show}}/my_action"
/trigger set conf_parser_item_index_click command "/command -buffer core.weechat trigger /conf_parser_${my_type}_${my_action} ${_bar_item_line}"

the trigger conf_parser_item_index_click is used to deal with mouse click on the conf_parser_item_index item. It send a toggle command if you click on the collapse/expand button otherwise it send the show command

/trigger addreplace conf_parser_config_run command "conf_parser_config_run"
/trigger set conf_parser_config_run regex "===.*===${if:${eval:${plugins.var.group_tools.conf_parser.misc.misc.filepath}}!=?${eval:${plugins.var.group_tools.conf_parser.misc.misc.filepath}}:${env:HOME}/config.md}===my_config"
/trigger set conf_parser_config_run command "/exec -oc -nosw sed -nE '/    \/${tg_argv2}/s/^    //p' ${my_config}"

the trigger conf_parser_config_run is used to run the code of config

/trigger addreplace conf_parser_config_show command "conf_parser_config_show"
/trigger set conf_parser_config_show regex "===.*===${if:${eval:${plugins.var.group_tools.conf_parser.misc.misc.filepath}}!=?${eval:${plugins.var.group_tools.conf_parser.misc.misc.filepath}}:${env:HOME}/config.md}===my_config"
/trigger set conf_parser_config_show command "/buffer clear exec.conf_parser;/exec -buffer conf_parser -nf -noln -name conf_parser_output -norc sed '' ${my_config}"

the trigger conf_parser_config_show is used to show the content of config

/trigger addreplace conf_parser_config_toggle command "conf_parser_config_toggle"
/trigger set conf_parser_config_toggle command "/mute -core /toggle plugins.var.group_tools.conf_parser.index.config.collapsed 1;/command -buffer core.weechat trigger /conf_parser_items_rebuild"

the trigger conf_parser_config_toggle is used to toggle config

/trigger addreplace conf_parser_section_run command "conf_parser_section_run;this command is not designed to be run manually"
/trigger set conf_parser_section_run conditions "${plugins.var.group_tools.conf_parser.misc.index.content} =~ ^(##[abcdefghijklmnopqrstuvwxyz0-9_]+\+[01](;###[abcdefghijklmnopqrstuvwxyz0-9_]+)+,)*##[abcdefghijklmnopqrstuvwxyz0-9_]+\+[01](;###[abcdefghijklmnopqrstuvwxyz0-9_]+)+$"
/trigger set conf_parser_section_run regex "===.*===${if:${eval:${plugins.var.group_tools.conf_parser.misc.misc.filepath}}!=?${eval:${plugins.var.group_tools.conf_parser.misc.misc.filepath}}:${env:HOME}/config.md}===my_config /.*/${plugins.var.group_tools.conf_parser.misc.index.content}/my_section /(\+0);[^,]+/${re:1}/my_section /;/,/my_section /.*/${split:1,#,strip_left,${split:1,+,,${split:${tg_argv1},,,${my_section}}}}/my_section"
/trigger set conf_parser_section_run command "/exec -oc -nosw sed -nE '/^## +${my_section} *$/,/^---/{/    \/${tg_argv2}/s/^    //p}' ${my_config}"

the trigger conf_parser_section_run is used to run the code of a section

/trigger addreplace conf_parser_section_show command "conf_parser_section_show;this command is not designed to be run manually"
/trigger set conf_parser_section_show conditions "${plugins.var.group_tools.conf_parser.misc.index.content} =~ ^(##[abcdefghijklmnopqrstuvwxyz0-9_]+\+[01](;###[abcdefghijklmnopqrstuvwxyz0-9_]+)+,)*##[abcdefghijklmnopqrstuvwxyz0-9_]+\+[01](;###[abcdefghijklmnopqrstuvwxyz0-9_]+)+$"
/trigger set conf_parser_section_show regex "===.*===${if:${eval:${plugins.var.group_tools.conf_parser.misc.misc.filepath}}!=?${eval:${plugins.var.group_tools.conf_parser.misc.misc.filepath}}:${env:HOME}/config.md}===my_config /.*/${plugins.var.group_tools.conf_parser.misc.index.content}/my_section /(\+0);[^,]+/${re:1}/my_section /;/,/my_section /.*/${split:1,#,strip_left,${split:1,+,,${split:${tg_argv1},,,${my_section}}}}/my_section"
/trigger set conf_parser_section_show command "/buffer clear exec.conf_parser;/exec -buffer conf_parser -nf -noln -name conf_parser_output -norc sed -nE '/^## +${my_section} *$/,/^---/p' ${my_config}"

the trigger conf_parser_section_show is used to show the content of a section

/trigger addreplace conf_parser_section_toggle command "conf_parser_section_toggle;this command is not designed to be run manually"
/trigger set conf_parser_section_toggle conditions "${plugins.var.group_tools.conf_parser.misc.index.content} =~ ^(##[abcdefghijklmnopqrstuvwxyz0-9_]+\+[01](;###[abcdefghijklmnopqrstuvwxyz0-9_]+)+,)*##[abcdefghijklmnopqrstuvwxyz0-9_]+\+[01](;###[abcdefghijklmnopqrstuvwxyz0-9_]+)+$"
/trigger set conf_parser_section_toggle regex "/.*/${plugins.var.group_tools.conf_parser.misc.index.content}/my_section /(\+0);[^,]+/${re:1}/my_section /;/,/my_section /.*/${split:1,+,,${split:${tg_argv1},,,${my_section}}}/my_section /.*/${plugins.var.group_tools.conf_parser.misc.index.content}/my_updated_index /(##[a-z0-9_]+)\+([01])/${if:${re:1}==${my_section}?${re:1}+${if:${re:2}==0}:${re:0}}/my_updated_index"
/trigger set conf_parser_section_toggle command "/mute -core /set plugins.var.group_tools.conf_parser.misc.index.content '${my_updated_index}';/command -buffer core.weechat trigger /conf_parser_items_rebuild"

the trigger conf_parser_section_toggle is used to toggle a section

/trigger addreplace conf_parser_subsection_run command "conf_parser_subsection_run;this command is not designed to be run manually"
/trigger set conf_parser_subsection_run conditions "${plugins.var.group_tools.conf_parser.misc.index.content} =~ ^(##[abcdefghijklmnopqrstuvwxyz0-9_]+\+[01](;###[abcdefghijklmnopqrstuvwxyz0-9_]+)+,)*##[abcdefghijklmnopqrstuvwxyz0-9_]+\+[01](;###[abcdefghijklmnopqrstuvwxyz0-9_]+)+$"
/trigger set conf_parser_subsection_run regex "===.*===${if:${eval:${plugins.var.group_tools.conf_parser.misc.misc.filepath}}!=?${eval:${plugins.var.group_tools.conf_parser.misc.misc.filepath}}:${env:HOME}/config.md}===my_config /.*/${plugins.var.group_tools.conf_parser.misc.index.content}/my_section_and_sub /(\+0);[^,]+/${re:1}/my_section_and_sub /[^,;]+([,;]|$)/${if:${re:repl_index}<=${tg_argv1}?${re:0}}/my_section_and_sub /[;,]$//my_section_and_sub /.*/${split:-1,,,${my_section_and_sub}}/my_section_and_sub /.*/${split:1,#,strip_left,${split:1,+,,${split:1,;,,${my_section_and_sub}}}}/my_section /.*/${split:1,#,strip_left,${split:-1,;,,${my_section_and_sub}}}/my_subsection"
/trigger set conf_parser_subsection_run command "/exec -oc -nosw sed -nE '/^## +${my_section} *$/,/^---/{/^### +${my_subsection} *$/,/^(---|___)/{/    \/${tg_argv2}/s/^    //p}}' ${my_config}"

the trigger conf_parser_subsection_run is used to run the code of a subsection

/trigger addreplace conf_parser_subsection_show command "conf_parser_subsection_show;this command is not designed to be run manually"
/trigger set conf_parser_subsection_show conditions "${plugins.var.group_tools.conf_parser.misc.index.content} =~ ^(##[abcdefghijklmnopqrstuvwxyz0-9_]+\+[01](;###[abcdefghijklmnopqrstuvwxyz0-9_]+)+,)*##[abcdefghijklmnopqrstuvwxyz0-9_]+\+[01](;###[abcdefghijklmnopqrstuvwxyz0-9_]+)+$"
/trigger set conf_parser_subsection_show regex "===.*===${if:${eval:${plugins.var.group_tools.conf_parser.misc.misc.filepath}}!=?${eval:${plugins.var.group_tools.conf_parser.misc.misc.filepath}}:${env:HOME}/config.md}===my_config /.*/${plugins.var.group_tools.conf_parser.misc.index.content}/my_section_and_sub /(\+0);[^,]+/${re:1}/my_section_and_sub /[^,;]+([,;]|$)/${if:${re:repl_index}<=${tg_argv1}?${re:0}}/my_section_and_sub /[;,]$//my_section_and_sub /.*/${split:-1,,,${my_section_and_sub}}/my_section_and_sub /.*/${split:1,#,strip_left,${split:1,+,,${split:1,;,,${my_section_and_sub}}}}/my_section /.*/${split:1,#,strip_left,${split:-1,;,,${my_section_and_sub}}}/my_subsection"
/trigger set conf_parser_subsection_show command "/buffer clear exec.conf_parser;/exec -buffer conf_parser -nf -noln -name conf_parser_output -norc sed -nE '/^## +${my_section} *$/,/^---/{/^### +${my_subsection} *$/,/^(---|___)/p}' ${my_config}"

the trigger conf_parser_subsection_show is used to show the content of a subsection

/trigger addreplace conf_parser_dependencies_colored modifier "conf_parser_dependencies_colored"
/trigger set conf_parser_dependencies_colored conditions "${tg_modifier_data} =~ ^[abcdefghijklmnopqrstuvwxyz0-9_]+$ && ${tg_string_nocolor} =~ ^([^ ,:]+, ?)*[^ ,:]+$"
/trigger set conf_parser_dependencies_colored regex "/.*/${tg_modifier_data}/my_type /^(plugin|script)s$/${re:1}/my_type /.*/${tg_string_nocolor}/my_dependencies / //my_dependencies /$/,/my_dependencies /([^,]+),/${define:my_color_category,${if:${my_type}=~^(plugin|script)$?${info:${my_type}_loaded,${re:1}}:${if:${my_type}==triggers?${length:${trigger.trigger.${re:1}.arguments}}:${if:${my_type}==secures?${if:${length:${sec.data.${re:1}}}!=}:${if:${my_type}==weechat?${if:${info:version_number}>=${info:version_number,${re:1}}}:2}}}}}${color:${if:${my_color_category}==2?*white:${if:${my_color_category}!=?*121:*163}}}${re:1}, /my_dependencies /, $//my_dependencies /.*/${my_dependencies}/tg_string"

the trigger conf_parser_dependencies_colored is used to color the dependencies to help the user known if the dependencies are met or not

/trigger addreplace conf_parser_content_rebuild line "free;exec.exec.conf_parser;exec_cmd_conf_parser_output"
/trigger set conf_parser_content_rebuild conditions "${plugins.var.group_tools.conf_parser.misc.index.content} =~ ^(##[abcdefghijklmnopqrstuvwxyz0-9_]+\+[01](;###[abcdefghijklmnopqrstuvwxyz0-9_]+)+,)*##[abcdefghijklmnopqrstuvwxyz0-9_]+\+[01](;###[abcdefghijklmnopqrstuvwxyz0-9_]+)+$"
/trigger set conf_parser_content_rebuild regex "/^(<!--|---|___|\*\*\*| *$).*/${if:${buffer.own_lines.last_line.data.message}!~^ $? }/message /^## +/${color:*31}Section: ${color:*white}/message /^### +/${color:*31}Subsection: ${color:*white}/message /^!\[WeeChat Screenshot\]\(([^)]+)\)/${color:*31}Screenshot: ${color:*white}${re:1}/message /^Dependencies: *$/${color:*31}${re:0}/message /^- +([abcdefghijklmnopqrstuvwxyz0-9_]+): +(.+)/· ${color:*31}${re:1}: ${modifier:conf_parser_dependencies_colored,${lower:${re:1}},${re:2}}/message ===^    (/.+)===    ${color:31}${hl:${re:1}}===message /\x1c/${color:31}/message"

the trigger conf_parser_content_rebuild is used to format the content of config, a section or a subsection in the conf_buffer buffer

/trigger addreplace conf_parser command "conf_parser;;;;download|gui|rebuild|update"
/trigger set conf_parser conditions "${tg_argv_eol1} =~ ^(download|gui|rebuild|update)$"
/trigger set conf_parser regex "===.*===${if:${eval:${plugins.var.group_tools.conf_parser.misc.misc.filepath}}!=?${eval:${plugins.var.group_tools.conf_parser.misc.misc.filepath}}:${env:HOME}/config.md}===my_config /.*/${tg_argv_eol1}/my_cmds_to_run /$/ /my_cmds_to_run /^update /download rebuild gui /my_cmds_to_run ===download ===/exec -sh -norc -nosw curl -sfo ~/config.md https://gist.githubusercontent.com/pascalpoitras/8406501/raw/config.md;===my_cmds_to_run ===rebuild ===/wait 1s /exec -hsignal conf_parser_index_rebuild sed -E '/^##/!d' ${my_config};===my_cmds_to_run ===gui ===/wait 1s /exec -norc -buffer conf_parser -nf true===my_cmds_to_run"
/trigger set conf_parser command "/command -buffer core.weechat * /command -s ${my_cmds_to_run}"

the trigger conf_parser is used to switch to the conf_parser buffer and to rebuild the index

/set weechat.buffer.exec.exec.conf_parser.short_name config
/set weechat.buffer.exec.exec.conf_parser.title Conf Parser  Input: (r) run the code in a section/subsection, (s) show the info and code of a section/subsection, (t) toggle a section

some buffer properties

/bar add conf_parser_line window,${buffer.full_name}==exec.exec.conf_parser left 0 0 conf_parser_item_line
/bar set conf_parser_line color_fg *31
/bar set conf_parser_line priority 1

the conf_parser_line bar which display the conf_parser_item_line item

/bar add conf_parser_index window,${buffer.full_name}==exec.exec.conf_parser left 15 1 conf_parser_item_index
/bar set conf_parser_index color_fg *31

the conf_parser_index bar which display the conf_parser_item_index item

/key bindctxt mouse @item(conf_parser_item_line):button1* hsignal:conf_parser_item_line_click
/key bindctxt mouse @item(conf_parser_item_index):button1* hsignal:conf_parser_item_index_click

bind button1 on both item

/conf_parser update

download the config.md file, rebuild the index and launch the buffer

conf_parser is a useful way to install stuff from this config, you can view the code with syntax highlighting, execute it, see if the dependencies are met and so on.


dev_info

WeeChat Screenshot

Dependencies:

  • WeeChat: 3.1
  • Plugins: exec, trigger
  • Triggers: utils_date_calc_days, utils_date_preferred

/trigger addreplace devinfo command "devinfo;infos about WeeChat;[-extra] [-match];-extra: displays extra informations like in how many day the next stable will be released${\n}-match: show if you are up-to-date${\n}${\n}This command retrieve infos about current and next stable version.${\n}${\n}Exemples:${\n}  Verbose output:${\n}    /${tg_trigger_name} -extra -match;-extra|-match|%*"
/trigger set devinfo conditions "${tg_argv_eol1} =~ ^(-(extra|match)( +|$))*$"
/trigger set devinfo regex "/.*/${tg_argv_eol1}/my_flags / +/_/my_flags /-//my_flags"
/trigger set devinfo command "/exec -norc -timeout 5 -hsignal devinfo_${my_flags} url:https://weechat.org/dev/info/all/"

/trigger addreplace devinfo_hsignal hsignal "devinfo_*"
/trigger set devinfo_hsignal conditions "${err} == && ${info:python_version} !="
/trigger set devinfo_hsignal regex "/.*/${tg_signal}/my_flags /^devinfo_//my_flags /(?n)^stable:(.*)/${re:0}${if:${my_flags}=~match&&${info:version}!~-(dev|rc[0-9]+)? ${if:${re:1}==${info:version}?${color:121}(as mine!):${color:163}(mine is ${info:version})}}/out /(?n)^devel:(.*)/${re:0}${if:${my_flags}=~match&&${info:version}=~-(dev|rc[0-9]+)? ${if:${re:1}==${info:version}?${color:121}(as mine!):${color:163}(mine is ${info:version})}}/out /.*/${info:version_git}/my_git /^[^g]+g(.*)/${re:1}/my_git /(?n)^git:(.*)/${re:0}${if:${my_flags}=~match&&${info:version}=~-(dev|rc[0-9]+)? ${if:${re:1}=~^${my_git}?${color:121}(as mine!):${color:163}(mine is ${info:version_git})}}/out /(?n)^(stable_date:)(.*)/${re:1}${info:date_preferred,${re:2}}${if:${my_flags}=~extra? (since ${info:date_calc_days,${re:2}} days)}/out /(?n)^(next_stable_date:)(.*)/${re:1}${info:date_preferred,${re:2}}${if:${my_flags}=~extra? (${info:date_calc_days,${re:2}} days left)}/out /_/ /out /(?n)^([^:]+:)(.*)/${color:31}${re:1} ${color:default}${re:2}/out /\n/\x5cn/out"
/trigger set devinfo_hsignal command "/print -current -escape ${out}"

The devinfo trigger create the devinfo command which is used to retrieve info from https://weechat.org/dev/info/all/ and tell you if you're up-to-date (if you use the -match flag) and in how many days the next stable will be released (if you use the -extra flag)



translate

WeeChat Screenshot

Dependencies:

  • WeeChat: 4.1.0
  • Plugins: exec, trigger
  • Programs: translate-shell
  • Triggers: utils_search_server_buffer_ptr

/set plugins.var.translate_lang fr
/set weechat.buffer.irc.*.*fr.localvar_set_translate_lang en

/trigger addreplace translate modifier weechat_print
/trigger set translate conditions "${tg_tags} =~ ,exec_cmd_translated_(text|lang),"
/trigger set translate regex "/.*/${color:*_31}${if:${tg_tags}=~,exec_cmd_translated_text,?Translation:Language}${color:reset}\t${tg_message_nocolor}/"

/trigger addreplace translate_hsignal hsignal "translate_text;translate_lang;translate_dict"
/trigger set translate_hsignal conditions "${tg_signal} != translate_dict || ${tg_signal} == translate_dict && ${_chat_word} !="
/trigger set translate_hsignal regex "/.*/${split:1,,strip_left+strip_right+collapse_seps,${info:spell_dict,${_buffer}}}/my_main_spell_dict /.*/${split:1,_,,${env:LANG}}/my_env_lang /.*/${_buffer_localvar_translate_lang},${if:${_buffer_localvar_type}=~^(channel|private)$?${buffer[${info:search_server_buffer_ptr,${_buffer}}].local_variables.translate_lang}},${plugins.var.translate_lang},${my_main_spell_dict},${my_env_lang}/my_lang /.*/${split:1,,strip_left+strip_right+collapse_seps,${my_lang}}/my_lang /.*/${if:${tg_signal}=~text$?-brief -target ${my_lang}:${if:${tg_signal}=~lang$?-brief -id:-dictionary}}/my_options /.*/${if:${tg_signal}=~dict$?${_chat_word}:${_chat_focused_line}}/my_text"
/trigger set translate_hsignal command "/command -buffer ${_buffer_full_name} * /exec -norc -name ${tg_signal} trans -no-autocorrect -no-ansi -j ${my_options} -- ${my_text}"

/key bindctxt cursor @chat:t /window ${_window_number};hsignal:translate_text;/cursor stop
/key bindctxt cursor @chat:l /window ${_window_number};hsignal:translate_lang;/cursor stop
/key bindctxt cursor @chat:d /window ${_window_number};hsignal:translate_dict;/cursor stop

This let you translate text with the translate-shell program (package has the same name, at least for Debian). If you want to translate something someone said, press the middle mouse button on the message then press 't'. If you want to know the language of the text, press 'l' instead. Finally, you can press 'd' this will open a buffer and call translate-shell in dictionary mode. For the key 't', the target language is choosed like this: if there is a translate_lang localvar for the buffer, use the langage specified by this localvar. If not, check if the buffer is a channel or private and if so, check if there is a translate_lang localvar for the corresponding server buffer. If not, check if the option plugins.var.translate_lang exist. Otherwhise, check if there is a main spell dict set and if not use the LANG env. So, 1) buffer localvar 2) server buffer localvar 3) option 4) main spell dict 5) LANG environment variable



nick_validation

WeeChat Screenshot

Dependencies:

  • Plugins: irc, python, trigger

/trigger addreplace nick_validation modifier "input_text_display"
/trigger set nick_validation conditions "${tg_string_nocolor} =~ ^/nick . && ${buffer.plugin.name} == irc"
/trigger set nick_validation regex "/.*/${tg_string_nocolor}/my_nick ===^/nick (.+)===${re:1}===my_nick /^-all (.+)/${re:1}/my_nick ===.*===${if:${tg_string_nocolor}=~^/nick -all[ ]?${info:python_eval,infolist = weechat.infolist_get('irc_server', '', '')\nwhile weechat.infolist_next(infolist):\n if weechat.infolist_integer(infolist, 'is_connected'): print(weechat.infolist_string(infolist, 'name') + ' ')\nweechat.infolist_free(infolist)}:${server}} ===my_servers ===[^ ]+===\n${define:my_nicklen,${info:irc_server_isupport_value,${re:0},NICKLEN}}${if:${info:irc_is_nick,${re:0},${my_nick}}!=?${color:16,46}:${color:16,163}}${re:0} ${color:reverse} NICKLEN = ${calc:${my_nicklen} - ${length:${my_nick}}}/${my_nicklen}  CASEMAPPING = ${info:irc_server_isupport_value,${re:0},CASEMAPPING}  UTF8MAPPING = ${if:${info:irc_server_isupport_value,${re:0},UTF8MAPPING}!=?${info:irc_server_isupport_value,${re:0},UTF8MAPPING}:no}${color:16,default}===my_servers /.*/${re:0} ${my_servers}/tg_string"

This trigger will give you hint about max nickname length and available character in nickname and will also tell you if the nick is valid or not. Also note that weechat has limited support for the rfc8265. For example, on an ergo server with utf8 nickname enabled, weechat correctly report the nickname é as valid but incorrectly report │ as valid.



animated_logo

WeeChat Screenshot

Dependencies:

  • WeeChat: 4.1.0
  • Plugins: python, trigger

/trigger addoff logo_refresh timer "500;0;0"
/trigger set logo_refresh regex "/.*/${plugins.var.logo_colors}/my_colors /^,*$/24,31,121,163,229,white/my_colors ===.*===___       __         ______________        _____===my_first ===.*===__ |     / /___________  ____/__  /_______ __  /_===my_second ===.*===__ | /| / /_  _ \  _ \  /    __  __ \  __ `/  __/===my_third ===.*===__ |/ |/ / /  __/  __/ /___  _  / / / /_/ // /_===my_forth ===.*===____/|__/  \___/\___/\____/  /_/ /_/\__,_/ \__/===my_fifth /[^ ]/${color:*${split:random,,collapse_seps+strip_left+strip_right,${my_colors}}}${re:0}${color:reset}/my_first /[^ ]/${color:*${split:random,,collapse_seps+strip_left+strip_right,${my_colors}}}${re:0}${color:reset}/my_second /[^ ]/${color:*${split:random,,collapse_seps+strip_left+strip_right,${my_colors}}}${re:0}${color:reset}/my_third /[^ ]/${color:*${split:random,,collapse_seps+strip_left+strip_right,${my_colors}}}${re:0}${color:reset}/my_forth /[^ ]/${color:*${split:random,,collapse_seps+strip_left+strip_right,${my_colors}}}${re:0}${color:reset}/my_fifth"
/trigger set logo_refresh command "/print -free -newbuffer logo -y 0 ${my_first};/print -free -newbuffer logo -y 1 ${my_second};/print -free -newbuffer logo -y 2 ${my_third};/print -free -newbuffer logo -y 3 ${my_forth};/print -free -newbuffer logo -y 4 ${my_fifth}"

/trigger addreplace logo command "logo;WeeChat Animated Logo;start|stop|toggle|faster|slower || timer <time> [<align> [<number>]] || speed <speed> || color [\"<range>...\" [\"<name>...\"]]; start: start the animation${\n}  stop: stop the animation${\n}toggle: toggle the animation${\n}faster: increase the speed of the animation${\n}slower: decrease the speed of the animation${\n} timer: use a custom ms${\n} speed: use a preset${\n} color: specify the colors${\n}  time: number of ms${\n} align: alignment on second${\n}number: max number of calls${\n} speed: one of the following values: ultra, fast, normal, slow${\n} range: a range, eg: 3-35${\n}  name: name of a color${\n}${\n}Let's play with the WeeChat Animated ASCII logo!${\n}${\n}Exemples:${\n}  Start the timer !!${\n}    /logo start${\n}  Change the colors${\n}    /logo color \"\" \"24 31 121 163 229 white\";start|stop|toggle|faster|slower || timer 5000|4000|3000|2000|1000 || speed ultra|fast|normal|slow || color 0-255"
/trigger set logo conditions "${tg_argv_eol1} =~ (?-i)^(start|stop|toggle|faster|slower)$ || ${tg_argv_eol1} =~ (?-i)^timer +[0-9]+( +[0-9]+)?( +[0-9]+)?$ || ${tg_argv_eol1} =~ (?-i)^speed +(ultra|fast|normal|slow)$ || (${tg_shell_argv1} == color && ${tg_shell_argv2} =~ (?-i)^ *(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-6])-([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-6])( +|$))*$ && ${tg_shell_argc} <= 4)"
/trigger set logo regex "/.*/${tg_argv1}/my_action /start/enable/my_action /stop/disable/my_action /.*/${trigger.trigger.logo_refresh.arguments}/my_hook_args /.*/${split:1,;,,${my_hook_args}}/my_current_ms /.*/${if:${my_action}==timer?${tg_argv3}:${split:2,;,,${my_hook_args}}}/my_align_sec /.*/${if:${my_action}==timer?${tg_argv4}:${split:3,;,,${my_hook_args}}}/my_num_call /.*/${if:${my_action}==faster?${if:${my_current_ms}<=50?${my_current_ms}:${calc:${my_current_ms}-50}}:${if:${my_action}==slower?${calc:${my_current_ms}+50}:${if:${my_action}=~^(speed|timer)$?${tg_argv2}}}}/my_speed /ultra/5/my_speed /fast/50/my_speed /normal/500/my_speed /slow/1000/my_speed /.*/${if:${my_action}==color?${tg_shell_argv2}}/my_colors /([0-9]+)-([0-9]+)/${info:python_eval,print(' '.join(map(str, list(range(${re:1},${re:2})))))}/my_colors /$/${if:${my_action}==color? ${tg_shell_argv3}}/my_colors / +/,/my_colors /^,|,$//my_colors ===.*===/mute ${if:${my_action}=~(enable|disable|toggle)?/trigger ${my_action} logo_refresh:${if:${my_action}==color?/set plugins.var.logo_colors '${my_colors}':/trigger set logo_refresh arguments ${my_speed};${my_align_sec};${my_num_call}}}===my_cmds_to_run"
/trigger set logo command "/command -buffer core.weechat * /eval ${my_cmds_to_run}"

/key bindctxt mouse @chat(core.logo):button1 /logo toggle
/key bindctxt mouse @chat(core.logo):button1-gesture-left* /logo slower
/key bindctxt mouse @chat(core.logo):button1-gesture-right* /logo faster

/set weechat.buffer.core.logo.title Animated WeeChat Logo - Click on the logo to toggle the animation - Use gesture to increase and decrease the speed

/alias add logo_xmas /logo color "" "34 46 40 124 160 196 white"
/alias add logo_config /logo color "" "24 31 121 163 229 white"

useless thing but nonetheless beautiful



Games


memory

WeeChat Screenshot

Dependencies:

  • WeeChat: 4.1.0
  • Plugins: python, trigger

/set weechat.buffer.core.memory_game.short_name memory
/set weechat.buffer.core.memory_game.clear 1
/set weechat.buffer.core.memory_game.title Memory Game  Keys: alt+space: show the grid bar, alt-n: new game, ←↑→↓: move the cursor  Input: space: flip card q: quit

/set weechat.buffer.core.memory_game.key_bind_meta-n /play_memory 4 13
/set weechat.buffer.core.memory_game.key_bind_up /memory_game_keyboard up
/set weechat.buffer.core.memory_game.key_bind_down /memory_game_keyboard down
/set weechat.buffer.core.memory_game.key_bind_left /memory_game_keyboard left
/set weechat.buffer.core.memory_game.key_bind_right /memory_game_keyboard right
/set weechat.buffer.core.memory_game.key_bind_meta-space /bar toggle memory_game_choose_grid
/key bindctxt mouse @chat(core.memory_game):button1 hsignal:memory_game
/key bindctxt mouse @item(memory_game_choose_grid):button1-event-drag hsignal:memory_game_item_selected
/key bindctxt mouse @item(memory_game_choose_grid):button1* hsignal:memory_game_item_start

/item addreplace memory_game_choose_grid "" "${repeat:13,▆ ▆ ▆ ▆ ▆ ▆ ▆ ▆ ▆ ▆ ▆ ▆ ▆${\n}}"
/bar add memory_game_choose_grid window,${buffer.full_name}==core.memory_game top 0 1 memory_game_choose_grid
/bar set memory_game_choose_grid filling_top_bottom vertical
/bar set memory_game_choose_grid color_fg white
/bar toggle memory_game_choose_grid

/alias add play_memory /memory_game $1 $2 🍅🍌🍒🍓🥒🍇🍉🍋🍍🫐🥕🥦🍭🍕🥨🥑🍐🫒🧅🥣🍿🍟🥔🫑🎂🍬🐵🐒🦍🦧🐶🦮🐩🐺🦊🦝🐈🦁🐯🐅🐆🐴🐎🦄🦓🦌🦬🐮🐂🐃🐮🐄🐷🐖🐗🐽🐏🐪🦙🦒🐘🦣🦏🦛🐭🐁🐀🐹🐇🐰🦫🦔🦇🐻🐨🐼🦥🦦🦨🦘🦡🦃🐔🐓🐤🐦🐧🦅🦆🦢🦉🦤🦩🦚🦜🐸🐊🐢🦎🐍🐲🦕🦖🐋🐬🦭🐟🐠🐡🦈🐙🐌🦋🐛🐜🐝🪲🐞🦗🦂🦟🪰🪱

/trigger addreplace memory_game command "memory_game;memory card game by r3m;<lines> <cols> <emojis>; lines: the number of lines${\n}  cols: the number of columns${\n}emojis: a list of emojis (must have enough emojis for the grid size you request)${\n}${\n}Create a grid of 4 lines and 13 cols (require 26 emojis for a grid of 52 cards):${\n}${\n}  /${tg_trigger_name} 4 13 🍅🍌🍒🍓🥒🍇🍉🍋🍍🫐🥕🥦🍭🍕🥨🥑🍐🫒🧅🥣🍿🍟🥔🫑🎂🍬;4 13 🍅🍌🍒🍓🥒🍇🍉🍋🍍🫐🥕🥦🍭🍕🥨🥑🍐🫒🧅🥣🍿🍟🥔🫑🎂🍬"
/trigger set memory_game conditions "${info:python_version} != && ${tg_argv_eol1} =~ ^[1-9][0-9]* +[1-9][0-9]* . && ${calc:${tg_argv1}*${tg_argv2}} <= ${calc:${length:${tg_argv3}}*2} && ${calc:${tg_argv1}*${tg_argv2}} =~ [02468]$ && ${calc:${length:${tg_argv3}}*2} == ${lengthscr:${tg_argv3}}"
/trigger set memory_game regex "/.*/${tg_argv1}/my_nb_lines /.*/${tg_argv2}/my_nb_cols /.*/${tg_argv3}/my_emojis /.*/${cutscr:${calc:${my_nb_lines}*${my_nb_cols}},,${my_emojis}}/my_emojis /.*/${info:python_eval,import random; emoji = list(\x22${repeat:2,${my_emojis}}\x22); random.shuffle(emoji); print(''.join(emoji))}/my_cards /./${re:0}${if:${calc:${re:repl_index}%${my_nb_cols}}==0?|}/my_cards /[^|]/${re:0},/my_cards /.*/${repeat:${calc:${my_nb_lines}*2-1},,}/my_cmds_to_run ===,===${if:${re:repl_index}=~[13579]$?${define:my_cards_line,${calc:${re:repl_index}//2+1}}/mute -core /set plugins.var.memory_game.cards_in_line_${my_cards_line} ${split:${my_cards_line},|,,${my_cards}};/mute -core /set plugins.var.memory_game.cards_state_in_line_${my_cards_line} ${repeat:${my_nb_cols},hidden,};:/print -newbuffer memory_game -free -y ${re:repl_index} ┃${repeat:${calc:${my_nb_cols}*3+1}, }┃;}===my_cmds_to_run ===$===/print -switch -newbuffer memory_game -free -y 0 ┏${repeat:${calc:${my_nb_cols}*3+1},━}┓;/print -newbuffer memory_game -free -y ${calc:${my_nb_lines}*2} ┗${repeat:${calc:${my_nb_cols}*3+1},━}┛;===my_cmds_to_run ===.*===/mute -core /unset -mask plugins.var.memory_game.*;/buffer clear memory_game;/mute -core /set plugins.var.memory_game.lines ${my_nb_lines};/mute -core /set plugins.var.memory_game.cols ${my_nb_cols};/mute -core /set plugins.var.memory_game.cursor_pos 1,1;${re:0}===my_cmds_to_run ===.*===${if:${plugins.var.memory_game.wait}!=?/print -core -error the card animation most complete, please try again in 2 seconds:${re:0}}===my_cmds_to_run"
/trigger set memory_game command "/command -buffer core.weechat * /eval -s ${my_cmds_to_run}"

/trigger addreplace memory_game_line_modified config "plugins.var.memory_game.cards_state_in_line_*;plugins.var.memory_game.cursor_line_*"
/trigger set memory_game_line_modified conditions "${plugins.var.memory_game.cards_state_in_line_${split:-1,_,,${tg_option}}} !="
/trigger set memory_game_line_modified regex "/.*/${split:-1,_,,${tg_option}}/my_cards_line /.*/${calc:${my_cards_line}*2-1}/my_buffer_line /.*/${plugins.var.memory_game.cursor_pos}/my_cursor_pos /.*/${plugins.var.memory_game.cards_state_in_line_${my_cards_line}}/my_value /.*/${my_value}/my_updated_line /([^,]+),/${if:${my_cards_line},${re:repl_index}==${my_cursor_pos}?${color:121}→: }${if:${re:1}==hidden?${color:,31}❓:${if:${re:1}==found?  :${color:,24}${split:${re:repl_index},,,${plugins.var.memory_game.cards_in_line_${my_cards_line}}}}}${color:reset}/my_updated_line /.*/┃${re:0} ┃/my_updated_line /.*/${repeat:${plugins.var.memory_game.lines},,}/my_win /,/${if:${re:repl_index}==${my_cards_line}?${my_value}:${plugins.var.memory_game.cards_state_in_line_${re:repl_index}}}/my_win /.*/${if:${re:0}=~^(found,)+$?1}/my_win ===$===/print -newbuffer memory_game -free -y ${my_buffer_line} ${my_updated_line};${if:${my_win}!=?/buffer clear memory_game;/print -newbuffer memory_game -free ${color:reset} ${color:*_121}YOU WON!}===my_cmds_to_run"
/trigger set memory_game_line_modified command "/command -buffer core.weechat * /eval -s ${my_cmds_to_run}"

/trigger addreplace memory_game_mouse hsignal memory_game
/trigger set memory_game_mouse conditions "${plugins.var.memory_game.wait} == && ${_chat_line_y} =~ [13579]$ && ${_chat_line_y} <= ${calc:${plugins.var.memory_game.lines}*2-1} && ${_chat_line_x} > 1 && ${_chat_line_x} <= ${calc:${plugins.var.memory_game.cols}*3} && ${calc:(${_chat_line_x}+1)%3} =~ ^[01]$ && ${split:${calc:(${_chat_line_x}+1)//3},,,${plugins.var.memory_game.cards_state_in_line_${calc:${_chat_line_y}//2+1}}} == hidden"
/trigger set memory_game_mouse regex "===.*===${calc:${_chat_line_y}//2+1}===my_cards_line ===.*===${calc:(${_chat_line_x}+1)//3}===my_cards_col"
/trigger set memory_game_mouse command "/memory_game_flip_card ${my_cards_line} ${my_cards_col}"

/trigger addreplace memory_game_input signal buffer_user_input_memory_game
/trigger set memory_game_input conditions "${plugins.var.memory_game.wait} == && ${tg_signal_data} =~ ^[ ]$ && ${split:${split:2,,,${plugins.var.memory_game.cursor_pos}},,,${plugins.var.memory_game.cards_state_in_line_${split:1,,,${plugins.var.memory_game.cursor_pos}}}} == hidden"
/trigger set memory_game_input regex "/.*/${split:1,,,${plugins.var.memory_game.cursor_pos}}/my_cards_line /.*/${split:2,,,${plugins.var.memory_game.cursor_pos}}/my_cards_col"
/trigger set memory_game_input command "/memory_game_flip_card ${my_cards_line} ${my_cards_col}"

/trigger addreplace memory_game_keyboard command memory_game_keyboard
/trigger set memory_game_keyboard conditions "${tg_argv_eol1} =~ ^(up|down|left|right)$"
/trigger set memory_game_keyboard regex "/.*/${tg_argv1}/my_key /.*/${plugins.var.memory_game.cursor_pos}/my_cursor_pos /.*/${split:1,,,${my_cursor_pos}}/my_cards_line /.*/${split:2,,,${my_cursor_pos}}/my_cards_col /.*/${plugins.var.memory_game.lines}/my_nb_lines /.*/${plugins.var.memory_game.cols}/my_nb_cols /.*/${if:${my_key}==left?${if:${my_cards_col}==1?${if:${my_cards_line}==1?${my_nb_lines}:${calc:${my_cards_line}-1}},${my_nb_cols}:${my_cards_line},${calc:${my_cards_col}-1}}:${if:${my_key}==right?${if:${my_cards_col}==${my_nb_cols}?${if:${my_cards_line}==${my_nb_lines}?1:${calc:${my_cards_line}+1}},1:${my_cards_line},${calc:${my_cards_col}+1}}:${if:${my_key}==up?${if:${my_cards_line}==1?${my_nb_lines},${if:${my_cards_col}==1?${my_nb_cols}:${calc:${my_cards_col}-1}}:${calc:${my_cards_line}-1},${my_cards_col}}:${if:${my_key}==down?${if:${my_cards_line}==${my_nb_lines}?1,${if:${my_cards_col}==${my_nb_cols}?1:${calc:${my_cards_col}+1}}:${calc:${my_cards_line}+1},${my_cards_col}}}}}}/my_new_cursor_pos"
/trigger set memory_game_keyboard command "/mute -core /set plugins.var.memory_game.cursor_pos ${my_new_cursor_pos};/mute -core /set plugins.var.memory_game.cursor_line_${split:1,,,${my_cursor_pos}} ${my_new_cursor_pos};/mute -core /set plugins.var.memory_game.cursor_line_${split:1,,,${my_new_cursor_pos}} ${my_new_cursor_pos}"

/trigger addreplace memory_game_flip_card command memory_game_flip_card
/trigger set memory_game_flip_card regex "/.*/${tg_argv1}/my_cards_line /.*/${tg_argv2}/my_cards_col /.*/${plugins.var.memory_game.second_card}/my_second_card /.*/${plugins.var.memory_game.cards_state_in_line_${my_cards_line}}/my_updated_states /[^,]+/${if:${re:repl_index}==${my_cards_col}?flipped:${re:0}}/my_updated_states /.*/${if:${my_second_card}!=?${split:1,,,${plugins.var.memory_game.card_1_pos}}}/my_first_card_line /.*/${if:${my_second_card}!=?${split:2,,,${plugins.var.memory_game.card_1_pos}}}/my_first_card_col /.*/${if:${my_second_card}!=?${if:${split:${my_cards_col},,,${plugins.var.memory_game.cards_in_line_${my_cards_line}}}==${split:${my_first_card_col},,,${plugins.var.memory_game.cards_in_line_${my_first_card_line}}}?found:hidden}}/my_result /.*/${if:${my_second_card}!=?${if:${my_first_card_line}==${my_cards_line}?${my_updated_states}:${plugins.var.memory_game.cards_state_in_line_${my_first_card_line}}}}/my_first_card_states /[^,]+/${if:${re:repl_index}==${my_first_card_col}?${my_result}:${re:0}}/my_first_card_states /.*/${if:${my_second_card}!=?${if:${my_first_card_line}==${my_cards_line}?${my_first_card_states}:${my_updated_states}}}/my_second_card_states /[^,]+/${if:${re:repl_index}==${my_cards_col}?${my_result}:${re:0}}/my_second_card_states ===$===/mute -core /set plugins.var.memory_game.cards_state_in_line_${my_cards_line} ${my_updated_states};${if:${my_second_card}==?/mute -core /set plugins.var.memory_game.second_card 1;/mute -core /set plugins.var.memory_game.card_1_pos ${my_cards_line},${my_cards_col}:/mute -core /unset plugins.var.memory_game.second_card;/mute -core /set plugins.var.memory_game.wait 1;/wait 2s /mute -core /set plugins.var.memory_game.cards_state_in_line_${my_first_card_line} ${my_first_card_states};/wait 2s /mute -core /set plugins.var.memory_game.cards_state_in_line_${my_cards_line} ${my_second_card_states};/wait 2s /mute -core /unset plugins.var.memory_game.wait}===my_cmds_to_run"
/trigger set memory_game_flip_card command "/command -buffer core.weechat * /eval -s ${my_cmds_to_run}"

/trigger addreplace memory_game_item_start hsignal memory_game_item_start
/trigger set memory_game_item_start conditions "${_bar_item_name} == ${_bar_item_name2} && ${_bar_item_line} == 0 && ${_bar_item_col} == 0 && ${_bar_item_line2} >= 0 && ${_bar_item_col2} >= 0"
/trigger set memory_game_item_start regex "/.*/${calc:${_bar_item_line2}+1}/my_nb_lines /.*/${calc:${_bar_item_col2}+1}/my_nb_cols ===.*===${calc:${my_nb_cols}//2${if:${my_nb_cols}=~[13579]?+1})}===my_nb_cols"
/trigger set memory_game_item_start command "/play_memory ${my_nb_lines} ${my_nb_cols};/mute -core /item addreplace memory_game_choose_grid ${\x22}${\x22} ${\x22}${repeat:13,▆ ▆ ▆ ▆ ▆ ▆ ▆ ▆ ▆ ▆ ▆ ▆ ▆${raw:${\n}}}${\x22};/bar toggle memory_game_choose_grid"

/trigger addreplace memory_game_item_selected hsignal memory_game_item_selected
/trigger set memory_game_item_selected conditions "${_bar_item_name} == ${_bar_item_name2} && ${_bar_item_line} == 0 && ${_bar_item_col} == 0 && ${_bar_item_line2} >= 0 && ${_bar_item_col2} >= 0"
/trigger set memory_game_item_selected regex "/.*/${calc:${_bar_item_line2}+1}/my_nb_lines /.*/${calc:${_bar_item_col2}+1}/my_nb_cols ===.*===${calc:${my_nb_cols}//2${if:${my_nb_cols}=~[13579]?+1})}===my_nb_cols ===.*===${color:${if:${calc:${my_nb_lines}*${my_nb_cols}}=~[02468]$?121:163}}===my_color /.*/${my_color}▆ ▆ ▆ ▆ ▆ ▆ ▆ ▆ ▆ ▆ ▆ ▆ ▆/my_selected_lines /[ ▆]/${if:${calc:${re:repl_index}-1-${_bar_item_col2}}==1?${color:reset}}${re:0}/my_selected_lines /$/${raw:${\x5cn}}/my_selected_lines /.*/${repeat:${calc:${_bar_item_line2}+1},${my_selected_lines}}/my_selected_lines /.*/▆ ▆ ▆ ▆ ▆ ▆ ▆ ▆ ▆ ▆ ▆ ▆ ▆/my_not_selected_lines /.*/${repeat:${calc:13-(${_bar_item_line2}+1)},${my_not_selected_lines}${raw:${\x5cn}}}/my_not_selected_lines /.*/${my_selected_lines}${my_not_selected_lines}/my_colored_content" 
/trigger set memory_game_item_selected command "/command -buffer core.weechat * /mute -core /item addreplace memory_game_choose_grid ${\x22\x22} ${\x22}${my_colored_content}${\x22}"

This game is not a full-blown memory card game. It only contains the core functionality. It doesn't track the time you took to complete the game. I made this game for two reasons. The first reason is because it was fun and educative, the second reason is to serve as a POC (proof of concept) of what can be accomplished using triggers.

You can play with as many cards as you want (most be even and you must provide enough emojis) in the disposition you want (you specify the line and cards by line).

There is 2 ways to play:

  1. with the mouse
  2. with the arrows keys to move and space+enter to select the card


slider

WeeChat Screenshot

Dependencies:

  • WeeChat: 4.1.0
  • Plugins: python, trigger

/set weechat.buffer.core.sliding_game.short_name sliding
/set weechat.buffer.core.sliding_game.clear 1
/set weechat.buffer.core.sliding_game.title Sliding Game  Keys: alt-n,1-9: new game, ←↑→↓: move a number  Input: q: quit
/repeat 7 /mute /set weechat.buffer.core.sliding_game.key_bind_meta-n,${calc:${repeat_index}+2} /sliding_game ${calc:${repeat_index}+2}
/set weechat.buffer.core.sliding_game.key_bind_up /sliding_game_keyboard up
/set weechat.buffer.core.sliding_game.key_bind_down /sliding_game_keyboard down
/set weechat.buffer.core.sliding_game.key_bind_right /sliding_game_keyboard right
/set weechat.buffer.core.sliding_game.key_bind_left /sliding_game_keyboard left
/key bindctxt mouse @chat(core.sliding_game):button1 hsignal:sliding_game

/trigger addreplace sliding_game command "sliding_game;sliding game by r3m;<number>;number: create a grid of number*number${\n}${\n}This is a sliding game (or also named the fifteen) for WeeChat. You need to reorder the number. You can create a 3x3, 4x4, 5x5, 6x6, 7x7, 8x8 and 9x9 grid. In fact you can play with a larger grid by modifying the conditions of the trigger but it is not recommended, it will be very slow.${\n}${\n}Play a 3x3 grid:${\n}${\n}  /${tg_trigger_name} 3;3"
/trigger set sliding_game conditions "${info:python_version} != && ${tg_argv_eol1} =~ ^[3-9]?$"
/trigger set sliding_game regex "/.*/${if:${tg_argv1}==?3:${tg_argv1}}/my_nb /.*/${info:python_eval,import random; number = list(map(str, range(0,${calc:${my_nb}*${my_nb}}))); random.shuffle(number); print(','.join(number))}/my_random_numbers /.*/${my_random_numbers}/my_inversions /[^,]+/${if:${re:0}==0?0:${info:sliding_game_how_many_inversion,${split:${re:repl_index},,keep_eol,${my_inversions}}}}/my_inversions /,/+/my_inversions /.*/${calc:${my_inversions}}/my_inversions /.*/${my_random_numbers}/my_space_line ===[^,]+===${if:${re:0}==0?${calc:(${re:repl_index}-1)//${my_nb}}}===my_space_line /,//my_space_line /.*/${if:${my_nb}=~[02468]$?${calc:${re:0}+${my_space_line}}:${re:0}}/my_inversions /,/,,/my_random_numbers /^([^,]+),,([^,]+),(.*),([^,]+),,([^,]+)$/${if:${my_nb}=~[02468]$&&${my_inversions}=~[02468]$||${my_nb}=~[13579]$&&${my_inversions}=~[13579]$?${if:,${re:1},${re:2},!~,0,?${re:2},${re:1},${re:3},${re:4},${re:5}:${re:1},${re:2},${re:3},${re:5},${re:4}}:${re:0}}/my_random_numbers /,+/,/my_random_numbers /(^|,)0/${re:1} /my_random_numbers ===.*===/buffer clear sliding_game;/mute -core /unset -mask plugins.var.sliding_game.*;/mute -core /set plugins.var.sliding_game.random_numbers \x22${my_random_numbers}\x22;/mute -core /set plugins.var.sliding_game.nb ${my_nb};/sliding_game_draw===my_cmds_to_run"
/trigger set sliding_game command "/command -buffer core.weechat * /eval -s ${my_cmds_to_run}"

/trigger addreplace sliding_game_draw command sliding_game_draw
/trigger set sliding_game_draw regex "/.*/${plugins.var.sliding_game.nb}/my_nb /.*/${plugins.var.sliding_game.moves}/my_moves /^$/0/my_moves /.*/${plugins.var.sliding_game.random_numbers}/my_random_numbers /.*/${my_random_numbers}/my_inversions /(^|,) ($|,)//my_inversions /[^,]+/${info:sliding_game_how_many_inversion,${split:${re:repl_index},,keep_eol,${my_inversions}}}/my_inversions /,/+/my_inversions /.*/${calc:${my_inversions}}/my_inversions /.*/${if:${my_inversions}==&&${my_random_numbers}=~[ ]$?1:0}/my_win /.*/${repeat:${calc:${my_nb}*${my_nb}},,}/my_cmds_to_run ===,===${define:my_cell_value,${split:${re:repl_index},,,${my_random_numbers}}}${define:my_cell_line_number,${calc:(${re:repl_index}-1)//${my_nb}+1}}${define:my_cell_width,9}${define:my_cell_modulo_nb_cols,${calc:${re:repl_index}%${my_nb}}}${define:my_cell_value_modulo_nb_cols,${calc:${my_cell_value}%${my_nb}}}${if:${my_cell_modulo_nb_cols}==1?${if:${my_cell_line_number}==1?┏${repeat:${calc:${my_nb}-1},━━━━━━━━━┳}━━━━━━━━━┓;}┃}${if:${my_win}!=&&${my_cell_value}=~[ ]?${color:*_121}YOU WON!${color:reset} :${if:${my_cell_value_modulo_nb_cols}==1?${color:*white}:${color:*31}}${my_cell_value}${color:reset}${repeat:${calc:${my_cell_width}-${length:${my_cell_value}}}, }}┃${if:${my_cell_modulo_nb_cols}==0?;${repeat:2,┃${repeat:${my_nb},         ┃};}${if:${my_cell_line_number}!=${my_nb}?┣${repeat:${calc:${my_nb}-1},━━━━━━━━━╋}━━━━━━━━━┫:┗${repeat:${calc:${my_nb}-1},━━━━━━━━━┻}━━━━━━━━━┛;${color:31}Moves: ${color:reset}${my_moves}};}===my_cmds_to_run ===[^;]+===/print -newbuffer sliding_game -free -y ${calc:${re:repl_index}-1} ${re:0}===my_cmds_to_run ===$===${if:${my_win}!=?/mute -core /set plugins.var.sliding_game.win 1}===my_cmds_to_run" 
/trigger set sliding_game_draw command "/command -buffer core.weechat * /eval -s ${my_cmds_to_run}"

/trigger addreplace sliding_game_how_many_inversion info sliding_game_how_many_inversion
/trigger set sliding_game_how_many_inversion regex "/.*/${tg_arguments}/my_number /,0//my_number /.*/${my_number}/my_remaining /^([^,]+).*/${re:1}/my_number /^[^,]+(.*)/${re:1}/my_remaining /[^,]+/${if:${my_number}>${re:0}?.}/my_remaining /,//my_remaining /.*/${length:${my_remaining}}/tg_info"

/trigger addreplace sliding_game_mouse hsignal sliding_game
/trigger set sliding_game_mouse conditions "${define:my_nb_lines_and_cols,${plugins.var.sliding_game.nb}}${plugins.var.sliding_game.win} == && ${_chat_line_x} < ${calc:${my_nb_lines_and_cols}*9+${my_nb_lines_and_cols}} && ${_chat_line_x} !~ 0$ && ${_chat_line_y} > 0 && ${_chat_line_y} < ${calc:${my_nb_lines_and_cols}*3+${my_nb_lines_and_cols}} && ${calc:${_chat_line_y}%4} != 0"
/trigger set sliding_game_mouse regex "/.*/${plugins.var.sliding_game.nb}/my_nb ===.*===${calc:${_chat_line_y}//4+1}===my_cell_line ===.*===${calc:${_chat_line_x}//10+1}===my_cell_col ===.*===${calc:(${my_cell_line} - 1)*${my_nb}+${my_cell_col}}===my_cell_index /.*/${plugins.var.sliding_game.random_numbers}/my_random_numbers /.*/${split:${my_cell_index},,,${my_random_numbers}}/my_cell_value /.*/${info:sliding_game_look_around,${my_nb},${my_cell_line},${my_cell_col},${my_cell_index},space,${my_random_numbers}}/my_space_relative_position / /${if:${my_space_relative_position}!=?-: }/my_random_numbers /[^,]+/${if:${re:0}==${my_cell_value}&&${my_space_relative_position}!=? :${re:0}}/my_random_numbers /-/${my_cell_value}/my_random_numbers ===$===/mute -core /set plugins.var.sliding_game.random_numbers \x22${my_random_numbers}\x22${if:${my_space_relative_position}!=?;/mute -core /set plugins.var.sliding_game.moves ${calc:${plugins.var.sliding_game.moves}+1};/sliding_game_draw}===my_cmds_to_run"
/trigger set sliding_game_mouse command "/command -buffer core.weechat * /eval -s ${my_cmds_to_run}"

/trigger addreplace sliding_game_keyboard command sliding_game_keyboard
/trigger set sliding_game_keyboard conditions "${plugins.var.sliding_game.win} == && ${buffer.full_name} == core.sliding_game && ${tg_argv_eol1} =~ ^(up|down|left|right)$"
/trigger set sliding_game_keyboard regex "/.*/${tg_argv1}/my_key /.*/${plugins.var.sliding_game.nb}/my_nb /.*/${plugins.var.sliding_game.random_numbers}/my_random_numbers /.*/${my_random_numbers}/my_space_cell_index /[^,]+/${if:${re:0}=~[ ]?${re:repl_index}}/my_space_cell_index /,//my_space_cell_index ===.*===${calc:(${my_space_cell_index}-1)//${my_nb}+1}===my_space_cell_line /.*/${calc:${my_space_cell_index}%${my_nb}}/my_space_cell_col /.*/${if:${my_key}==up?below:${if:${my_key}==down?above:${if:${my_key}==left?right:left}}}/my_direction /.*/${info:sliding_game_look_${my_direction},${my_nb},${my_space_cell_line},${my_space_cell_col},${my_space_cell_index},number,${my_random_numbers}}/my_number_cell_value / /${if:${my_number_cell_value}!=?-: }/my_random_numbers /[^,]+/${if:${re:0}==${my_number_cell_value}&&${my_number_cell_value}!=? :${re:0}}/my_random_numbers /-/${my_number_cell_value}/my_random_numbers ===$===/mute -core /set plugins.var.sliding_game.random_numbers \x22${my_random_numbers}\x22${if:${my_number_cell_value}!=?;/mute -core /set plugins.var.sliding_game.moves ${calc:${plugins.var.sliding_game.moves}+1};/sliding_game_draw}===my_cmds_to_run"
/trigger set sliding_game_keyboard command "/command -buffer core.weechat * /eval -s ${my_cmds_to_run}"

/trigger addreplace sliding_game_number_input signal buffer_user_input_sliding_game
/trigger set sliding_game_number_input conditions "${plugins.var.sliding_game.win} == && ${tg_signal_data} =~ ^[1-9][0-9]*$ && ${tg_signal_data} < ${calc:${plugins.var.sliding_game.nb}*${plugins.var.sliding_game.nb}}"
/trigger set sliding_game_number_input regex "/.*/${tg_signal_data}/my_input /.*/${plugins.var.sliding_game.nb}/my_nb /.*/${plugins.var.sliding_game.random_numbers}/my_random_numbers /.*/${my_random_numbers}/my_number_cell_index /[^,]+/${if:${re:0}=~^${my_input}$?${re:repl_index}}/my_number_cell_index /,//my_number_cell_index ===.*===${calc:(${my_number_cell_index}-1)//${my_nb}+1}===my_number_cell_line /.*/${calc:${my_number_cell_index}%${my_nb}}/my_number_cell_col /.*/${info:sliding_game_look_around,${my_nb},${my_number_cell_line},${my_number_cell_col},${my_number_cell_index},space,${my_random_numbers}}/my_space_relative_position / /${if:${my_space_relative_position}!=?-: }/my_random_numbers /[^,]+/${if:${re:0}==${my_input}&&${my_space_relative_position}!=? :${re:0}}/my_random_numbers /-/${my_input}/my_random_numbers ===$===/mute -core /set plugins.var.sliding_game.random_numbers \x22${my_random_numbers}\x22${if:${my_space_relative_position}!=?;/mute -core /set plugins.var.sliding_game.moves ${calc:${plugins.var.sliding_game.moves}+1};/sliding_game_draw}===my_cmds_to_run"
/trigger set sliding_game_number_input command "/command -buffer core.weechat * /eval -s ${my_cmds_to_run}"

/trigger addreplace sliding_game_look_around info sliding_game_look_around;sliding_game_look_above;sliding_game_look_below;sliding_game_look_left;sliding_game_look_right
/trigger set sliding_game_look_around regex "/.*/${split:1,,,${tg_arguments}}/my_nb /.*/${split:2,,,${tg_arguments}}/my_cell_line /.*/${split:3,,,${tg_arguments}}/my_cell_col /.*/${split:4,,,${tg_arguments}}/my_cell_index /.*/${if:${split:5,,,${tg_arguments}}==space?[ ]:.}/my_search_for /.*/${split:6,,keep_eol,${tg_arguments}}/my_random_numbers /.*/${if:${my_cell_line}>1?${split:${calc:${my_cell_index}-${my_nb}},,,${my_random_numbers}}}/my_above_cell_value /.*/${split:${calc:${my_cell_index}+${my_nb}},,,${my_random_numbers}}/my_below_cell_value /.*/${if:${calc:${my_cell_col}%${my_nb}}!=1?${split:${calc:${my_cell_index}-1},,,${my_random_numbers}}}/my_left_cell_value /.*/${if:${calc:${my_cell_col}%${my_nb}}!=0?${split:${calc:${my_cell_index}+1},,,${my_random_numbers}}}/my_right_cell_value /.*/${if:${tg_info_name}!~around?${my_${split:-1,_,,${tg_info_name}}_cell_value}:${if:${my_above_cell_value}=~${my_search_for}?above:${if:${my_below_cell_value}=~${my_search_for}?below:${if:${my_left_cell_value}=~${my_search_for}?left:${if:${my_right_cell_value}=~${my_search_for}?right}}}}}/tg_info"

This game is not a full-blown sliding game. It only contains the core functionality. It doesn't track the time you took to complete the game. I made this game for two reasons. The first reason is because it was fun and educative, the second reason is to serve as a POC (proof of concept) of what can be accomplished using triggers.

you can play grid of 3x3, 4x4, 5x5, 6x6, 7x7, 8x8 and 9x9. in fact it is possible to play with much larger grid but it will be slow. It is possible but very unlikely that you start with an already won game, in this case, just press the shortcut again to start a new game. Since it's very unlikely I prefer to keep the code smaller, faster and especially less complicated.

There is three way to play.

  1. Using the mouse (Click on the number you want to move)
  2. Using the arrows (up to move the number below the empty cell in the cell, and so on)
  3. Using the input (enter the number you want to move then press enter)


sudoku

WeeChat Screenshot

Dependencies:

  • WeeChat: 4.1.0
  • Programs: qqwing
  • Plugins: exec, trigger

/set weechat.buffer.core.sudoku_game.short_name sudoku
/set weechat.buffer.core.sudoku_game.clear 1
/set weechat.buffer.core.sudoku_game.title Sudoku Game  Keys: alt-n,0-4: new game, alt-s: show solution, ←↑→↓|left-click: move, 1-9: insert, 0|backspace: remove a digit  Input: q: quit

/set weechat.buffer.core.sudoku_game.key_bind_meta-n,0 /sudoku_game play any
/set weechat.buffer.core.sudoku_game.key_bind_meta-n,1 /sudoku_game play simple
/set weechat.buffer.core.sudoku_game.key_bind_meta-n,2 /sudoku_game play easy
/set weechat.buffer.core.sudoku_game.key_bind_meta-n,3 /sudoku_game play intermediate
/set weechat.buffer.core.sudoku_game.key_bind_meta-n,4 /sudoku_game play expert
/set weechat.buffer.core.sudoku_game.key_bind_meta-s /sudoku_game_show_solution
/set weechat.buffer.core.sudoku_game.key_bind_up /sudoku_game_keyboard_move up
/set weechat.buffer.core.sudoku_game.key_bind_down /sudoku_game_keyboard_move down
/set weechat.buffer.core.sudoku_game.key_bind_right /sudoku_game_keyboard_move right
/set weechat.buffer.core.sudoku_game.key_bind_left /sudoku_game_keyboard_move left
/set weechat.buffer.core.sudoku_game.key_bind_backspace /sudoku_game_keyboard_insert 0
/repeat 10 /mute /set weechat.buffer.core.sudoku_game.key_bind_${repeat_index0} /sudoku_game_keyboard_insert ${repeat_index0}
/key bindctxt mouse @chat(core.sudoku_game):button1 hsignal:sudoku_game_mouse_move

/alias add sudoku_game_show_solution /mute /set plugins.var.sudoku_game.animation 1;/repeat -interval 50ms 81 /eval -s /sudoku_game_keyboard_insert ${split:${split:2,,,${plugins.var.sudoku_game.cursor_pos}},|,strip_left,${split:${split:1,,,${plugins.var.sudoku_game.cursor_pos}},,,${plugins.var.sudoku_game.solved}}}\;/sudoku_game_keyboard_move right${if:${repeat_last}!=?\;/mute /unset plugins.var.sudoku_game.animation}

/trigger addreplace sudoku_game command "sudoku_game;sudoku for weechat using qqwing as generator and solver;play <difficulty> || debug;      play: play sudoku${\n}     debug: static puzzle, useful for debugging${\n}difficulty: simple, easy, intermediate, expert or any;play simple|easy|intermediate|expert|any || debug"
/trigger set sudoku_game conditions "${plugins.var.sudoku_game.animation} == && ${tg_argv_eol1} =~ (?-i)^play +(simple|easy|intermediate|expert|any)$ || ${tg_argv_eol1} =~ (?-i)^debug$"
/trigger set sudoku_game regex "/.*/${tg_argv1}/my_action /.*/${if:${my_action}==play?${tg_argv2}:simple}/my_difficulty /.*/${if:${my_action}==debug?debug}/my_hsignal_args ===.*===/buffer clear sudoku_game;/mute -core /unset -mask plugins.var.sudoku_game.*;/mute -core /set plugins.var.sudoku_game.cursor_pos 1,1;/mute -core /set plugins.var.sudoku_game.difficulty ${my_difficulty};/exec -hsignal sudoku_game_reply_${my_hsignal_args} qqwing --generate 1 --difficulty ${my_difficulty} --one-line --solution===my_cmds_to_run"
/trigger set sudoku_game command "/command -buffer core.weechat * /eval -s ${my_cmds_to_run}"

/trigger addreplace sudoku_game_reply hsignal "sudoku_game_reply_*"
/trigger set sudoku_game_reply conditions "${err} == && ${out} =~ ^[1-9.]{81}${\n}[1-9]{81}${\n}$ || ${tg_signal} =~ _debug$"
/trigger set sudoku_game_reply regex "/.*/${if:${tg_signal}=~_debug$?..9.4.....415..7.8.....1...5...7.....3.2.8....87.9......27......1..843.......35..\n259847163641532798873961245524376981936218457187495632362759814715684329498123576:${out}}/my_output /.*/${split:1,\n,,${my_output}}/my_unsolved /\./ /my_unsolved /.*/${my_unsolved}/my_unsolved_col /.*/${my_unsolved}/my_unsolved_block /./${define:my_col,${calc:(${re:repl_index}-1)%9+1}}|${re:0}${if:${my_col}==9?,}/my_unsolved /./${define:my_col,${calc:(${re:repl_index}-1)%9+1}}${define:my_col_${my_col}_content,${my_col_${my_col}_content}|${re:0}${if:${length:${my_col_${my_col}_content}}==16?,}}${if:${re:repl_index}==81?${my_col_1_content}${my_col_2_content}${my_col_3_content}${my_col_4_content}${my_col_5_content}${my_col_6_content}${my_col_7_content}${my_col_8_content}${my_col_9_content}}/my_unsolved_col ===.===${define:my_row,${calc:(${re:repl_index}-1)//9+1}}${define:my_col,${calc:(${re:repl_index}-1)%9+1}}${define:my_block_row,${calc:(${my_row}-1)//3+1}}${define:my_block_col,${calc:(${my_col}-1)//3+1}}${define:my_block,${calc:(${my_block_row}-1)*3+${my_block_col}}}${define:my_block_${my_block}_content,${my_block_${my_block}_content}|${re:0}${if:${length:${my_block_${my_block}_content}}==16?,}}${if:${re:repl_index}==81?${my_block_1_content}${my_block_2_content}${my_block_3_content}${my_block_4_content}${my_block_5_content}${my_block_6_content}${my_block_7_content}${my_block_8_content}${my_block_9_content}}===my_unsolved_block /.*/${split:2,\n,,${my_output}}/my_solved /./${define:my_col,${calc:(${re:repl_index}-1)%9+1}}|${re:0}${if:${my_col}==9?,}/my_solved ===.*===/mute -core /set plugins.var.sudoku_game.unsolved_orig '${my_unsolved}';/mute -core /set plugins.var.sudoku_game.unsolved '${my_unsolved}';/mute -core /set plugins.var.sudoku_game.unsolved_col '${my_unsolved_col}';/mute -core /set plugins.var.sudoku_game.unsolved_block '${my_unsolved_block}';/mute -core /set plugins.var.sudoku_game.solved ${my_solved};/sudoku_game_draw===my_cmds_to_run"
/trigger set sudoku_game_reply command "/command -buffer core.weechat * /eval -s ${my_cmds_to_run}"

/trigger addreplace sudoku_game_draw command sudoku_game_draw
/trigger set sudoku_game_draw conditions "${tg_argv_eol1} =~ (?-i)^(congrats)?$"
/trigger set sudoku_game_draw regex "/.*/${tg_argv1}/my_congrats /.*/${color:24}┏━━━┳━━━┳━━━${color:*39}┳${color:24}━━━┳━━━┳━━━${color:*39}┳${color:24}━━━┳━━━┳━━━┓/my_grid_top /.*/${color:24}┗━━━┻━━━┻━━━${color:*39}┻${color:24}━━━┻━━━┻━━━${color:*39}┻${color:24}━━━┻━━━┻━━━┛/my_grid_bottom /.*/${color:24}┣━━━╋━━━╋━━━${color:*39}╋${color:24}━━━╋━━━╋━━━${color:*39}╋${color:24}━━━╋━━━╋━━━┫/my_grid_lines_separator /.*/${color:*39}┣━━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━━┫/my_grid_blocks_separator /.*/${plugins.var.sudoku_game.unsolved}/my_unsolved /.*/${plugins.var.sudoku_game.unsolved_orig}/my_unsolved_orig /.*/${plugins.var.sudoku_game.unsolved_col}/my_unsolved_col /.*/${plugins.var.sudoku_game.unsolved_block}/my_unsolved_block /.*/${plugins.var.sudoku_game.cursor_pos}/my_cursor_pos ===\|([1-9 ])===${define:my_row,${calc:(${re:repl_index}-1)//9+1}}${define:my_col,${calc:(${re:repl_index}-1)%9+1}}${define:my_block_row,${calc:(${my_row}-1)//3+1}}${define:my_block_col,${calc:(${my_col}-1)//3+1}}${define:my_block,${calc:(${my_block_row}-1)*3+${my_block_col}}}${color:${if:${my_col}=~^(4|7)$?*39:24}}┃${if:${my_row},${my_col}==${my_cursor_pos}?${color:24,24}} ${color:reset}${color:${if:${re:1}=~[1-9]&&${split:${my_row},,,${my_unsolved}}=~${re:1}.*${re:1}||${split:${my_col},,,${my_unsolved_col}}=~${re:1}.*${re:1}||${split:${my_block},,,${my_unsolved_block}}=~${re:1}.*${re:1}?163:${if:${split:${my_col},|,strip_left,${split:${my_row},,,${my_unsolved_orig}}}=~[1-9]?121:white}}}${re:1}${if:${my_row},${my_col}==${my_cursor_pos}?${color:24,24}} ${color:reset}===my_unsolved /.*/${repeat:19,,}/my_cmds_to_run ===,===${define:my_grid_line,${re:repl_index}}${define:my_buffer_line,${calc:${re:repl_index}-1}}${define:my_digit_line,${calc:${re:repl_index}//2}}/print -newbuffer sudoku_game -free -y ${my_buffer_line} ${if:${my_grid_line}==1?${my_grid_top}:${if:${my_grid_line}==19?${my_grid_bottom}:${if:${my_grid_line}=~^(7|13)$?${my_grid_blocks_separator}:${if:${my_grid_line}=~[13579]$?${my_grid_lines_separator}:${split:${my_digit_line},,,${my_unsolved}}${color:24}┃}}}};===my_cmds_to_run ===$===/print -newbuffer sudoku_game -free -y 19 ${if:${my_congrats}!=?${color:reset}${repeat:14, }${color:*_121}YOU WON!:${color:121}Difficulty: ${plugins.var.sudoku_game.difficulty}}===my_cmds_to_run"
/trigger set sudoku_game_draw command "/command -buffer core.weechat * /eval -s ${my_cmds_to_run}"

/trigger addreplace sudoku_game_keyboard_move command sudoku_game_keyboard_move
/trigger set sudoku_game_keyboard_move conditions "${plugins.var.sudoku_game.win} == && ${buffer.full_name} == core.sudoku_game && ${tg_argv_eol1} =~ (?-i)^(up|down|left|right)$"
/trigger set sudoku_game_keyboard_move regex "/.*/${tg_argv1}/my_key /.*/${plugins.var.sudoku_game.cursor_pos}/my_cursor_pos /.*/${split:1,,,${my_cursor_pos}}/my_row /.*/${split:2,,,${my_cursor_pos}}/my_col /.*/${if:${my_key}==left?${if:${my_col}==1?${if:${my_row}==1?9:${calc:${my_row}-1}},9:${my_row},${calc:${my_col}-1}}:${if:${my_key}==right?${if:${my_col}==9?${if:${my_row}==9?1:${calc:${my_row}+1}},1:${my_row},${calc:${my_col}+1}}:${if:${my_key}==up?${if:${my_row}==1?9,${if:${my_col}==1?9:${calc:${my_col}-1}}:${calc:${my_row}-1},${my_col}}:${if:${my_key}==down?${if:${my_row}==9?1,${if:${my_col}==9?1:${calc:${my_col}+1}}:${calc:${my_row}+1},${my_col}}}}}}/my_new_cursor_pos"
/trigger set sudoku_game_keyboard_move command "/mute -core /set plugins.var.sudoku_game.cursor_pos ${my_new_cursor_pos};/sudoku_game_draw"

/trigger addreplace sudoku_game_mouse_move hsignal sudoku_game_mouse_move
/trigger set sudoku_game_mouse_move conditions "${plugins.var.sudoku_game.win} == && ${_chat_line_y} > 0 && ${_chat_line_y} < 18 && ${_chat_line_y} =~ [13579]$ && ${_chat_line_x} > 0 && ${_chat_line_x} < 36 && ${calc:${_chat_line_x}%4} !="
/trigger set sudoku_game_mouse_move regex "===.*===${calc:${_chat_line_y}//2+1}===my_row ===.*===${calc:${_chat_line_x}//4+1}===my_col"
/trigger set sudoku_game_mouse_move command "/mute -core /set plugins.var.sudoku_game.cursor_pos ${my_row},${my_col};/sudoku_game_draw"

/trigger addreplace sudoku_game_keyboard_insert command sudoku_game_keyboard_insert
/trigger set sudoku_game_keyboard_insert conditions "${plugins.var.sudoku_game.win} == && ${split:${split:2,,,${plugins.var.sudoku_game.cursor_pos}},|,strip_left,${split:${split:1,,,${plugins.var.sudoku_game.cursor_pos}},,,${plugins.var.sudoku_game.unsolved_orig}}} =~ [ ]"
/trigger set sudoku_game_keyboard_insert regex "/.*/${tg_argv1}/my_new_value /0/ /my_new_value /.*/${plugins.var.sudoku_game.cursor_pos}/my_cursor_pos /.*/${split:1,,,${my_cursor_pos}}/my_row /.*/${split:2,,,${my_cursor_pos}}/my_col ===.*===${calc:(${my_row}-1)//3+1}===my_block_row ===.*===${calc:(${my_col}-1)//3+1}===my_block_col /.*/${calc:(${my_block_row}-1)*3+${my_block_col}}/my_block /.*/${calc:(${my_row}-1)%3+1}/my_row_relative_to_block /.*/${calc:(${my_col}-1)%3+1}/my_col_relative_to_block /.*/${calc:(${my_row_relative_to_block}-1)*3+${my_col_relative_to_block}}/my_cell_relative_to_block /.*/${plugins.var.sudoku_game.unsolved}/my_unsolved /.*/${split:${my_row},,,${my_unsolved}}/my_updated_row /\|([1-9 ])/|${if:${re:repl_index}==${my_col}?${my_new_value}:${re:1}}/my_updated_row /[^,]+/${if:${re:repl_index}==${my_row}?${my_updated_row}:${re:0}}/my_unsolved /.*/${plugins.var.sudoku_game.unsolved_col}/my_unsolved_col /.*/${split:${my_col},,,${my_unsolved_col}}/my_updated_col /\|([1-9 ])/|${if:${re:repl_index}==${my_row}?${my_new_value}:${re:1}}/my_updated_col /[^,]+/${if:${re:repl_index}==${my_col}?${my_updated_col}:${re:0}}/my_unsolved_col /.*/${plugins.var.sudoku_game.unsolved_block}/my_unsolved_block /.*/${split:${my_block},,,${my_unsolved_block}}/my_updated_block /\|([1-9 ])/|${if:${re:repl_index}==${my_cell_relative_to_block}?${my_new_value}:${re:1}}/my_updated_block /[^,]+/${if:${re:repl_index}==${my_block}?${my_updated_block}:${re:0}}/my_unsolved_block /.*/${if:${my_unsolved}==${plugins.var.sudoku_game.solved}?1:0}/my_win ===.*===/mute -core /set plugins.var.sudoku_game.unsolved '${my_unsolved}';/mute -core /set plugins.var.sudoku_game.unsolved_col '${my_unsolved_col}';/mute -core /set plugins.var.sudoku_game.unsolved_block '${my_unsolved_block}';/sudoku_game_draw ${if:${my_win}!=?congrats;/mute -core /set plugins.var.sudoku_game.win 1}===my_cmds_to_run"
/trigger set sudoku_game_keyboard_insert command "/command -buffer core.weechat * /eval -s ${my_cmds_to_run}"

This is a basic sudoku game, support difficulty, keyboard+mouse, color the digit in a different color if it appears more than once in the same row, column or block. You need to install qqwing which is the generator/solver used here. This project is awesome and I would not have achieve this if I had to wrote the generator/solver myself!



Aliases


useful


/alias add cq /allpv /buffer close


fun


/alias addcompletion %(irc_channel)|%(nick)|%* slap /me slaps $* around a bit with a large trout
/alias addcompletion %(irc_channel)|%(nick)|%* fu /say (╹◡╹)凸 $*


Keys


history


/key bind up /input history_global_previous
/key bind down /input history_global_next


Filters


smart


/set irc.look.smart_filter on
/filter add irc_smart * irc_smart_filter *


Options


weechat


/set weechat.look.bar_more_down ""
/set weechat.look.bar_more_up ""
/set weechat.look.bar_more_left "…"
/set weechat.look.bar_more_right "…"
/set weechat.look.buffer_notify_default message
/set weechat.look.buffer_time_format "${color:245}%H${color:253}%M"
/set weechat.look.color_inactive_message off
/set weechat.look.color_inactive_prefix off
/set weechat.look.color_inactive_prefix_buffer off
/set weechat.look.color_inactive_window off
/set weechat.look.day_change_message_1date "── %a, %d %b %Y ──"
/set weechat.look.day_change_message_2dates "── %%a, %%d %%b %%Y (%a, %d %b %Y) ──"
/set weechat.look.highlight *pascalpoitras*
/set weechat.look.hotlist_add_conditions "${away} || ${buffer.num_displayed} == 0"
/set weechat.look.item_buffer_filter "•"
/set weechat.look.prefix_align_min 0
/set weechat.look.prefix_align_max 10
/set weechat.look.prefix_join "▬▬▶"
/set weechat.look.prefix_quit "◀▬▬"
/set weechat.look.prefix_suffix "│"
/set weechat.look.read_marker_string "─"
/set weechat.look.separator_horizontal ""

/set weechat.color.bar_more 229
/set weechat.color.chat_highlight lightred
/set weechat.color.chat_highlight_bg default
/set weechat.color.chat_host 31
/set weechat.color.chat_nick_colors "cyan,magenta,green,brown,lightblue,lightcyan,lightmagenta,lightgreen,blue"
/set weechat.color.chat_prefix_join 121
/set weechat.color.chat_prefix_more 31
/set weechat.color.chat_prefix_quit 131
/set weechat.color.chat_prefix_suffix 31
/set weechat.color.chat_read_marker 31
/set weechat.color.chat_time 239
/set weechat.color.chat_delimiters 31
/set weechat.color.eval_syntax_colors "229,179,228,178"
/set weechat.color.separator 31
/set weechat.color.status_data_highlight 163
/set weechat.color.status_data_msg 229
/set weechat.color.status_data_private 121
/set weechat.color.status_more 229
/set weechat.color.status_name 121
/set weechat.color.status_name_tls 121
/set weechat.color.status_time white
/set weechat.color.status_nicklist_count white
/set weechat.color.status_number white

/set weechat.history.max_buffer_lines_number 1024

/set weechat.buffer.core.weechat.notify 3
/set weechat.buffer.irc.server.*.notify 3


Run everything

to run everything from the config.md file, be sure to have:

  • WeeChat ≥ 4.3.0
  • the following programs
    • translate-shell
    • qqwing
  • the following plugins
    • alias
    • buflist
    • charset
    • exec
    • fset
    • irc
    • logger
    • python
    • relay
    • script
    • spell
    • trigger
  • the following python library
    • psutil

We also need to create three secures datasg. First, set the passphrase

/secure passphrase <pass>

then, create three secures datas

/secure set liberachatpass <pass>
/secure set defaultnicks <nicks-csv>
/secure set defaultsasluser <username>
/secure set relaypass <pass>

Now let's install the two scripts needed by this config

/set script.scripts.download_enabled on
/script install autosort.py cmd_help.py

wait for the script to be fully installed before continuing

then, type the following to run everything from config.md

/exec -sh -oc curl -sfS https://gist.githubusercontent.com/pascalpoitras/8406501/raw/config.md | sed -nE 's!^    /!/!p'
@pascalpoitras
Copy link
Author

pascalpoitras commented Aug 20, 2021

@rpfernandezjr

can you give me the output of the following commands

/eval -n ${trigger.trigger.newsmon.arguments}

and

/server list libera

@rpfernandezjr
Copy link

sure thing,

│14:55:35   │ >> ${trigger.trigger.newsmon.arguments}
│14:55:35   │ == [newsmon;irc_privmsg,matrix_message,debug_newsmon]
│14:55:45   │ 
│14:55:45   │ Servers with "libera":
│14:55:45   │  * libera [connected], nick: axin, 3 channels, 0 pv

here's my filter too

│   [news_interest] buffer: newsmon / tags: irc_privmsg+nick_newsly*,matrix_message+nick_newsly*,matrix_text+nick_newsly* / regex: !^(\s|\[)(Reddit [-] /r/netsec|r/Ripple|r/sre|r/devops|
│ Wired|EFF Updates|r/devops|erry's blog|techdirt|TorrentFreak|Science Daily|Hacker News|CNET|phoronix|Ars Technica|The Intercept|Huffington Post [-]
│ Weird News|Journal du hacker|Futura Sciences)( \-| | |\]) (disabled)

@pascalpoitras
Copy link
Author

ah it should be

irc.libera.##news;irc_privmsg,matrix_message,matrix_text,debug_newsmon

you set plugins.var.news_buffer_full_name to newsmon which is why you get this problem
do the following

/unset plugins.var.news_buffer_full_name

now rerun everything in the newsmon section of the configuration

@rpfernandezjr
Copy link

@pascalpoitras that did the trick, thanks!

@arooni
Copy link

arooni commented Aug 24, 2021

i noticed cpu usage is very high on this... anything i can do? 3.2 weechat on ubuntu 20.04 seeing cpu loads 20-30-40% when in use. quad core intel mobile processor

@pascalpoitras
Copy link
Author

pascalpoitras commented Aug 24, 2021

@arooni

as stated in the buflist section the buflist is slow for two reasons

the first reason is that the buflist is refresh each time the hotlist_changed signal is received, so each time a user join/part/quit or send a message for example the whole buflist is refresh (this is why when there is a netsplit weechat hang for a few seconds) so if you have a lots of channels the situation will be worse especially if these channels are active

the second reason is that my buflist configuration is very complex so each time the hotlist_changed signal is received, the buflist.format.* options are evaluated and those format are very complex and must be executed for each buffers, so again, if you have a lot of channels the situation will be a lot worse

A way to mitigate this a bit is to set the default notify level to message so that joins part and quit doesnt trigger the hotlist_changed signal this will help a lot but still slow

@arooni
Copy link

arooni commented Aug 24, 2021

thanks for the quick response @pascalpoitras!

can you tell me which notify setting you were saying?

what about disabling the hostlist_changed signal and leaving the rest? many thanks!

also how can i simply ignore when a users joins/parts/etc

@pascalpoitras
Copy link
Author

pascalpoitras commented Aug 24, 2021

@arooni

/set weechat.look.buffer_notify_default message

this way the hotlist_changed signal will not be triggered for low message (join/part/quit...). But if you pasted all the line from my config you probably already have this setting set to this value

this is an excellent question but that represent some issues:

if the buflist is no more refresh on this signal the buffers name in the buflist will no more be colored and the number of unread message will not be refresh too. I created an issue a few weeks ago to ask flashcode to add a new signal that is triggered only when the priority change, for example if the buffer #weechat have no unread message and then a low message is receive, emit the new signal. Then if another low message is receive, do nothing, but if a message with higher priority, a message or a highlight is received, then emit that signal, at least this way the buffer name color would be refresh and correct but you would not be able to display the number of unread messages. The issue is here if you want to thumbs it up to encourage flashcode to implement it

Sorry if anything is hard to understand, as english is not my native tongue

EDIT: and btw you can't disable this signal it is hardcoded :(

@pascalpoitras
Copy link
Author

I had to delete outdated comments because the page was loading so slowly, I apologize if some of you were relying on some comments but most of them were very outdated since this configuration is actively developed. I choose to keep only the comments of the current years so now the page is a lot more responsive!

@agonzal
Copy link

agonzal commented Sep 7, 2021

I was able to set the title color_bg and status color_bg to fit my needs but I am not able to see where I need to make the change to get the tabs (highmon, newsmon, chatmon, sys) to also be a different bg color. I see @rpfernandezjr was able to change the color. When I click into that window, the title color indeed changes (active vs inactive) but haven't been able to get the tabs, any ideas?

@pascalpoitras
Copy link
Author

pascalpoitras commented Sep 7, 2021

@agonzal

Hi,

to change the bg color of the tabs you have to modify the buflist.format.buffer option. Replace any occurence of 31 which is the color of the active tab background and 24 which is the color of the inactive tab background

@agonzal
Copy link

agonzal commented Sep 7, 2021

@pascalpoitras thank you for that, now I can say, it is complete! One can appreciate the amount of work put into this setup... /me tips hat!

@pascalpoitras
Copy link
Author

@agonzal thanks! if you have any other questions don't hesitate :)

@agonzal
Copy link

agonzal commented Sep 8, 2021

I guess is it possible to change the bg color (which is maybe 24 now) for the server headings in the buflist? I want to have a uniform look all around and want to go darkgray

@pascalpoitras
Copy link
Author

@agonzal

yes find the

/trigger set render_buflist regex ...

line in the config and change the 31 color to the color you want

do the same for the buflist.format.* options and plugins.var.buflist.format.* options

In the future I might add an option to easily change that but it add more evaluation and the buflist is already slow

@gngrn1nja
Copy link

thanks for all the help! awesome config/script btw!

@pascalpoitras
Copy link
Author

@gngrn1nja you are welcome :) I will delete some of the comments since they were nearly 30 and I try to keep the page fast

@Tahvok
Copy link

Tahvok commented Nov 8, 2021

I'm getting the following error with the buflist script:

Too few arguments for command "/bar set" (help on command: /help bar)

I'm trying to copy only the buflist from the scripts, and I'm unable to get anything displayed on the left - I just have a black column right now, and then I saw that I'm getting this error whenever I'm trying to resize it - so it might be related.

@pascalpoitras
Copy link
Author

pascalpoitras commented Nov 8, 2021

@Tahvok

what is the output of the following command

/v

@Tahvok
Copy link

Tahvok commented Nov 9, 2021

@pascalpoitras

WeeChat 3.3 [compiled on Sep 29 2021 03:55:37]

@pascalpoitras
Copy link
Author

@Tahvok

you need weechat 3.4 for the buflist as stated in the buflist section

for now, if you don't want to upgrade to 3.4 you can restore the default buflist settings with the following command:

/unset -mask buflist.*

@Phedre
Copy link

Phedre commented May 14, 2022

How can I get the matrix room name to show in the channel monitor and highlight monitor? They show up as "Matrix - Matrix - Username" instead of "Matrix - Room name - Username".

@pascalpoitras
Copy link
Author

@Phedre

HI, I'm not using matrix but I try to keep the config matrix compatible

can you type /buffer localvar on the matrix buffer and paste the output as a comment below

@Phedre
Copy link

Phedre commented May 15, 2022

@pascalpoitras Here is the output:

19:59 Local variables for buffer "server.matrix_org":
19:59   plugin: "python"
19:59   name: "server.matrix_org"
19:59   script_name: "matrix"
19:59   script_input_cb: "server_buffer_cb"
19:59   script_input_cb_data: "matrix_org"
19:59   script_close_cb: ""
19:59   script_close_cb_data: ""
19:59   type: "server"
19:59   nick: "phedre"
19:59   server: "matrix_org"
19:59   channel: "matrix_org"

And for a random matrix channel:

20:01 Local variables for buffer "matrix.matrix_org.!uXvvbgIhuFMCGAIeRR:maunium.net":
20:01   plugin: "python"
20:01   name: "matrix.matrix_org.!uXvvbgIhuFMCGAIeRR:maunium.net"
20:01   script_name: "matrix"
20:01   script_input_cb: "room_buffer_input_cb"
20:01   script_input_cb_data: "matrix_org"
20:01   script_close_cb: "room_buffer_close_cb"
20:01   script_close_cb_data: "matrix_org"
20:01   type: "channel"
20:01   channel: "matrix.matrix_org.!uXvvbgIhuFMCGAIeRR:maunium.net"
20:01   nick: "phedre"
20:01   server: "matrix_org"
20:01   domain: "matrix.org"
20:01   room_id: "!uXvvbgIhuFMCGAIeRR:maunium.net"
20:01   canonical_alias: "#gomuks:maunium.net"

@pascalpoitras
Copy link
Author

pascalpoitras commented May 15, 2022

@Phedre

Ok so it seems the room name is in the canonical_alias variable

you need to replace the ${channel} part in the following options

plugins.var.group_tools.chanmon.item.chan.content
plugins.var.group_tools.highmon.item.chan.content

by ${buffer.local_variables.canonical_alias} but for matrix only (keep ${channel} for irc)
but before changing the options, can you give me the output of /buffer get short_name on a matrix channel? if it also give the canonical alias then we could use ${buffer.short_name} instead for both matrix and IRC

@Phedre
Copy link

Phedre commented May 15, 2022

Thanks @pascalpoitras ! I will try that.

Here's the output of /buffer get short_name:

python.matrix.matrix_org.!uXvvbgIhuFMCGAIeRR:maunium.net: (str) short_name = #gomuks

@pascalpoitras
Copy link
Author

@Phedre

ok so you can replace ${channel} by ${buffer.short_name}

I advice you to use set or fset for this even if you can do it with the group_tools trigger since the trigger have changed a lot recently you might be using another version and so on, so by replacing ${channel} by ${buffer.short_name} in the two options in the last comment you will fix the problem

@catm4n
Copy link

catm4n commented May 21, 2022

hi pascal. those icons up in the news monitor aren't appearing for me.

@klapvogn
Copy link

klapvogn commented Aug 4, 2023

Hi,

so your mod of weechat dosn't work under a stable version ?

@pascalpoitras
Copy link
Author

@klapvogn

Hi,

the buflist and the translate sections both require the devel version, all other part should works just fine with a stable version

@klapvogn
Copy link

klapvogn commented Aug 4, 2023

@pascalpoitras

Hi again!

Can you maybe link to the dev seems to have a little trouble finding it :)

edit:
Will this work the same way, as compiling it

sudo apt-get update
sudo apt-get install weechat-dev

@pascalpoitras
Copy link
Author

@klapvogn

Hey!

weechat provide a custom repo for debian/raspbian/ubuntu so you can download the devel version, follow the instructions there https://weechat.org/download/debian/

@klapvogn
Copy link

klapvogn commented Aug 5, 2023

@pascalpoitras

Hi,

I use MobaXterm for terminal, and have tried Putty as well but I can resize the channel window.

Am I using the wrong programs?

Another think I noticed is when you have /mouse enable you can't double click an url so it gets copied, but when you disable mouse then there is no problem. You have a fix for that maybe?

@pascalpoitras
Copy link
Author

pascalpoitras commented Aug 5, 2023

@klapvogn

Hi,

By resizing the channel window I guess you mean the buflist ( the list with all the channels name )

I can't tell since I am using a different terminal: kitty, which I highly recommend by the way

For URL, I recommend to go in bare mode when you want to select an URL otherwise you'll have issue if the url spend multiple line

press alt+l to go in bare mode, then, on kitty I press shift+left click on the URL then press any key to quit bare mode, I don't know exactly how it's done for your terminal

@klapvogn
Copy link

klapvogn commented Aug 5, 2023

@pascalpoitras

Hi,

I'll have look at kitty :) <--- It rocks!!! 🥇

thanks

@pascalpoitras
Copy link
Author

@klapvogn

btw there is two kitty program

one is a fork of putty, I am not referring to this one

I am referring to this one: https://sw.kovidgoyal.net/kitty/

@klapvogn
Copy link

klapvogn commented Aug 5, 2023

@pascalpoitras

Oh, it's not made for windows :-(

edit:
1:What will you suggest for highlight my nick in channels?

2: /me action, can I color the text somehow?

@pascalpoitras
Copy link
Author

pascalpoitras commented Aug 6, 2023

@klapvogn

I highly recommend you read the user guide which will answer 99% of your current and future question

https://weechat.org/files/doc/devel/weechat_user.en.html

and also you can ask question in #weechat on libera

@klapvogn
Copy link

Hi @pascalpoitras

The only thing I can't find any fix to is the "/me" action where I would like it to color the text I'm written and not just the "*" sign

@pascalpoitras
Copy link
Author

@klapvogn

You will need a trigger or a script for that, I suggest either a modifier or a line trigger, help for trigger is in the user guide, if you need help you can PM me on IRC (r3m on libera)

@sandikata
Copy link

It not works as it's shown in the animations. (but i expected that).

@pascalpoitras are there any hidden from the guide additional steps ?

@pascalpoitras
Copy link
Author

@sandikata

no everything should be there, which part doesn't work as expected?

what is your weechat version ?

@sandikata
Copy link

Hello, weechat 4.1-dev

Mostly is a bloated part (news bar) but i just removed it.
I could say everything else is working for me, with my personal tweaks and settings.

Regards.

@dmnchild
Copy link

Maybe I overlooked something, but is there a comprehensive preemptive installs to make sure everything works? (fonts symbols packages etc.) I seen a couple along the way, but not everything worked out for me while try this all out. I had issues with the tabs at the top having unknown char's on both sides instead of being more tab like, some of the bars for top and bottom didnt clean up and have multi color changes after the >, so just curious if i overlooked something as I followed along.

@pascalpoitras
Copy link
Author

@dmnchild

You need a font with powerline and powerline-extra symbols

I recommend you pick one from nerdfonts

let me know if there's still an issue after you pick a font

@V13Axel
Copy link

V13Axel commented Dec 8, 2023

I've gotta know - How on earth do you develop and debug this? Do you have a syntax highlighting grammar you can point me to? There are lots of little things I want to tweak about it, but trying to understand all the conditionals gets a bit tricky without lots of manually reformatting everything in a separate editor and trying to pick it apart 😅

@pascalpoitras
Copy link
Author

@V13Axel I documented the triggers regex by regex so when I need to come back later on it is way easier to follow but yes this is kind of hard to follow at times. The absolute best tool to understand the regexes is to use the /trigger monitor command. This way each regex are on a different line and you also see the result of the evaluated code. What could be really useful (I'll ask FlashCode) is to add the new eval syntax highligting to the regexes in trigger monitor.

@pascalpoitras
Copy link
Author

@V13Axel disregard the previous comment about the trigger monitor, I meant the output of /trigger listfull would be useful with syntax highlighting

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment