diff --git a/hosts/hera/weechat/default.nix b/hosts/hera/weechat/default.nix index ba7e54cd..497251d3 100644 --- a/hosts/hera/weechat/default.nix +++ b/hosts/hera/weechat/default.nix @@ -23,6 +23,17 @@ in { target = ".weechat/perl"; source = ./plugins/perl; }; + buffer_autoset = { + target = ".weechat/buffer_autoset.conf"; + text = '' + [look] + timer = 1000 + + [buffer] + python.maralorn.de.*.highlight_words = "" + python.maralorn.de.*.highlight_regex = ".*maralorn([^\.].*|\.|\.[^d].*|)$" + ''; + }; buflist = { target = ".weechat/buflist.conf"; text = '' diff --git a/hosts/hera/weechat/plugins/python/autoload/buffer_autoset.py b/hosts/hera/weechat/plugins/python/autoload/buffer_autoset.py new file mode 120000 index 00000000..cdcf0db3 --- /dev/null +++ b/hosts/hera/weechat/plugins/python/autoload/buffer_autoset.py @@ -0,0 +1 @@ +../buffer_autoset.py \ No newline at end of file diff --git a/hosts/hera/weechat/plugins/python/buffer_autoset.py b/hosts/hera/weechat/plugins/python/buffer_autoset.py new file mode 100644 index 00000000..38dbc4b7 --- /dev/null +++ b/hosts/hera/weechat/plugins/python/buffer_autoset.py @@ -0,0 +1,350 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2010-2017 Sébastien Helleu +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +# +# Auto-set buffer properties when a buffer is opened. +# (this script requires WeeChat 1.0 or newer) +# +# History: +# +# 2018-04-14, Kim B. Heino: +# version 1.1: on startup apply settings to already opened buffers +# 2017-06-21, Sébastien Helleu : +# version 1.0: rename command /autosetbuffer to /buffer_autoset +# 2015-09-28, Simmo Saan : +# version 0.9: instantly apply properties +# 2015-07-12, Sébastien Helleu : +# version 0.8: add option buffer_autoset.look.timer to add a small timer +# before setting buffer properties +# 2015-04-05, Nils Görs : +# version 0.7: increase priority of hook_signal('buffer_opened') +# 2012-12-09, Nils Görs : +# version 0.6: add support of core buffer +# 2012-03-09, Sébastien Helleu : +# version 0.5: fix reload of config file +# 2012-01-03, Sébastien Helleu : +# version 0.4: make script compatible with Python 3.x +# 2010-12-02, Sébastien Helleu : +# version 0.3: "no_highlight_nicks" replaced by "hotlist_max_level_nicks" +# 2010-10-11, Sébastien Helleu : +# version 0.2: add example in /help autosetbuffer with new buffer +# property "no_highlight_nicks" +# 2010-04-19, Sébastien Helleu : +# version 0.1: initial release +# + +SCRIPT_NAME = "buffer_autoset" +SCRIPT_AUTHOR = "Sébastien Helleu " +SCRIPT_VERSION = "1.1" +SCRIPT_LICENSE = "GPL3" +SCRIPT_DESC = "Auto-set buffer properties when a buffer is opened" + +SCRIPT_COMMAND = SCRIPT_NAME + +import_ok = True + +try: + import weechat +except ImportError: + print("This script must be run under WeeChat.") + print("Get WeeChat now at: http://www.weechat.org/") + import_ok = False + +CONFIG_FILE_NAME = "buffer_autoset" + +# config file / options +bas_config_file = "" +bas_options = {} + + +# =================================[ config ]================================= + +def bas_config_init(): + """ + Initialization of configuration file. + Sections: buffer. + """ + global bas_config_file, bas_options + bas_config_file = weechat.config_new(CONFIG_FILE_NAME, + "bas_config_reload_cb", "") + if bas_config_file == "": + return + + # section "look" + section_look = weechat.config_new_section( + bas_config_file, "look", 0, 0, "", "", "", "", "", "", "", "", "", "") + if not section_look: + weechat.config_free(bas_config_file) + return + + # options in section "look" + bas_options["look_timer"] = weechat.config_new_option( + bas_config_file, section_look, "timer", "integer", + "Timer used to delay the set of properties (in milliseconds, " + "0 = don't use a timer)", + "", 0, 2147483647, "1", "1", 0, "", "", "", "", "", "") + + bas_options["look_instant"] = weechat.config_new_option( + bas_config_file, section_look, "instant", "boolean", + "Instantly apply properties to buffers affected", + "", 0, 0, "on", "on", 0, "", "", "", "", "", "") + + # section "buffer" + section_buffer = weechat.config_new_section( + bas_config_file, "buffer", 1, 1, "", "", "", "", "", "", + "bas_config_buffer_create_option_cb", "", "", "") + if not section_buffer: + weechat.config_free(bas_config_file) + return + + +def bas_config_buffer_create_option_cb(data, config_file, section, option_name, + value): + option = weechat.config_search_option(config_file, section, option_name) + if option: + return weechat.config_option_set(option, value, 1) + else: + option = weechat.config_new_option(config_file, section, option_name, + "string", "", "", 0, 0, "", + value, 0, "", "", "", "", "", "") + if not option: + return weechat.WEECHAT_CONFIG_OPTION_SET_ERROR + return weechat.WEECHAT_CONFIG_OPTION_SET_OK_SAME_VALUE + + +def bas_config_reload_cb(data, config_file): + """Reload configuration file.""" + return weechat.config_reload(config_file) + + +def bas_config_read(): + """Read configuration file.""" + global bas_config_file + return weechat.config_read(bas_config_file) + + +def bas_config_write(): + """Write configuration file.""" + global bas_config_file + return weechat.config_write(bas_config_file) + + +# ================================[ command ]================================= + +def bas_cmd(data, buffer, args): + """Callback for /buffer_autoset command.""" + args = args.strip() + if args == "": + weechat.command("", "/set %s.buffer.*" % CONFIG_FILE_NAME) + return weechat.WEECHAT_RC_OK + argv = args.split(None, 3) + if len(argv) > 0: + if argv[0] == "add": + if len(argv) < 4: + weechat.command("", "/help %s" % SCRIPT_COMMAND) + return weechat.WEECHAT_RC_OK + weechat.command("", "/set %s.buffer.%s.%s \"%s\"" + % (CONFIG_FILE_NAME, argv[1], argv[2], argv[3])) + elif argv[0] == "del": + if len(argv) < 2: + weechat.command("", "/help %s" % SCRIPT_COMMAND) + return weechat.WEECHAT_RC_OK + weechat.command("", "/unset %s.buffer.%s" + % (CONFIG_FILE_NAME, argv[1])) + else: + weechat.command("", "/help %s" % SCRIPT_COMMAND) + return weechat.WEECHAT_RC_OK + return weechat.WEECHAT_RC_OK + + +def bas_completion_current_buffer_cb(data, completion_item, buffer, + completion): + """ + Complete with current buffer name (plugin.name), + for command '/buffer_autoset'. + """ + name = "%s.%s" % (weechat.buffer_get_string(buffer, "plugin"), + weechat.buffer_get_string(buffer, "name")) + weechat.hook_completion_list_add(completion, name, + 0, weechat.WEECHAT_LIST_POS_BEGINNING) + return weechat.WEECHAT_RC_OK + + +def bas_completion_options_cb(data, completion_item, buffer, completion): + """Complete with config options, for command '/buffer_autoset'.""" + options = weechat.infolist_get("option", "", + "%s.buffer.*" % CONFIG_FILE_NAME) + if options: + while weechat.infolist_next(options): + weechat.hook_completion_list_add( + completion, + weechat.infolist_string(options, "option_name"), + 0, weechat.WEECHAT_LIST_POS_SORT) + weechat.infolist_free(options) + return weechat.WEECHAT_RC_OK + + +# ==========================[ timer/signal/option ]=========================== + +def bas_apply_options_for_buffer(buffer): + full_name = weechat.buffer_get_string(buffer, "full_name") + options = weechat.infolist_get("option", "", + "%s.buffer.*" % CONFIG_FILE_NAME) + if not options: + return + + while weechat.infolist_next(options): + option = weechat.infolist_string(options, "option_name") + value = weechat.infolist_string(options, "value") + if option: + pos = option.rfind(".") + if pos > 0: + buffer_mask = option[0:pos] + property = option[pos+1:] + if buffer_mask and property: + if weechat.string_match(full_name, buffer_mask, 1): + weechat.buffer_set(buffer, property, value) + + weechat.infolist_free(options) + + +def bas_timer_buffer_opened_cb(data, remaining_calls): + full_name = data + buffer = weechat.buffer_search("==", full_name) + if not buffer: + return weechat.WEECHAT_RC_OK + bas_apply_options_for_buffer(buffer) + return weechat.WEECHAT_RC_OK + + +def bas_signal_buffer_opened_cb(data, signal, signal_data): + global bas_options + buffer = signal_data + timer = weechat.config_integer(bas_options["look_timer"]) + if timer == 0: + bas_apply_options_for_buffer(buffer) + else: + weechat.hook_timer(timer, 0, 1, + "bas_timer_buffer_opened_cb", + weechat.buffer_get_string(buffer, "full_name")) + return weechat.WEECHAT_RC_OK + + +def bas_config_option_cb(data, option, value): + if not weechat.config_boolean(bas_options["look_instant"]): + return weechat.WEECHAT_RC_OK + + if not weechat.config_get(option): # option was deleted + return weechat.WEECHAT_RC_OK + + option = option[len("%s.buffer." % CONFIG_FILE_NAME):] + + pos = option.rfind(".") + if pos > 0: + buffer_mask = option[0:pos] + property = option[pos+1:] + if buffer_mask and property: + buffers = weechat.infolist_get("buffer", "", buffer_mask) + + if not buffers: + return weechat.WEECHAT_RC_OK + + while weechat.infolist_next(buffers): + buffer = weechat.infolist_pointer(buffers, "pointer") + weechat.buffer_set(buffer, property, value) + + weechat.infolist_free(buffers) + + return weechat.WEECHAT_RC_OK + + +# ==================================[ main ]================================== + +if __name__ == "__main__" and import_ok: + if weechat.register(SCRIPT_NAME, SCRIPT_AUTHOR, SCRIPT_VERSION, + SCRIPT_LICENSE, SCRIPT_DESC, "bas_unload_script", ""): + version = weechat.info_get("version_number", "") or 0 + if int(version) < 0x01000000: + weechat.prnt("", "%s%s: WeeChat 1.0 is required for this script." + % (weechat.prefix("error"), SCRIPT_NAME)) + else: + bas_config_init() + bas_config_read() + weechat.hook_command( + SCRIPT_COMMAND, + "Auto-set buffer properties when a buffer is opened", + "[add buffer property value] | [del option]", + " add: add a buffer/property/value in configuration file\n" + " del: delete an option from configuration file\n" + " buffer: name of a buffer (can start or end with \"*\" as " + "wildcard)\n" + "property: buffer property\n" + " value: value for property\n" + " option: name of option from configuration file\n\n" + "Examples:\n" + " disable timestamp on channel #weechat:\n" + " /" + SCRIPT_COMMAND + " add irc.freenode.#weechat " + "time_for_each_line 0\n" + " add word \"weechat\" in highlight list on channel " + "#savannah:\n" + " /" + SCRIPT_COMMAND + " add irc.freenode.#savannah " + "highlight_words_add weechat\n" + " disable highlights from nick \"mike\" on freenode server, " + "channel #weechat (requires WeeChat >= 0.3.4):\n" + " /" + SCRIPT_COMMAND + " add irc.freenode.#weechat " + "hotlist_max_level_nicks_add mike:2\n" + " disable hotlist changes for nick \"bot\" on freenode " + "server (all channels) (requires WeeChat >= 0.3.4):\n" + " /" + SCRIPT_COMMAND + " add irc.freenode.* " + "hotlist_max_level_nicks_add bot:-1", + "add %(buffers_plugins_names)|" + "%(buffer_autoset_current_buffer) " + "%(buffer_properties_set)" + " || del %(buffer_autoset_options)", + "bas_cmd", "") + weechat.hook_completion( + "buffer_autoset_current_buffer", + "current buffer name for buffer_autoset", + "bas_completion_current_buffer_cb", "") + weechat.hook_completion( + "buffer_autoset_options", + "list of options for buffer_autoset", + "bas_completion_options_cb", "") + weechat.hook_signal("9000|buffer_opened", + "bas_signal_buffer_opened_cb", "") + weechat.hook_config("%s.buffer.*" % CONFIG_FILE_NAME, + "bas_config_option_cb", "") + + # apply settings to all already opened buffers + buffers = weechat.infolist_get("buffer", "", "") + if buffers: + while weechat.infolist_next(buffers): + buffer = weechat.infolist_pointer(buffers, "pointer") + bas_signal_buffer_opened_cb("", "", buffer) + weechat.infolist_free(buffers) + + +# ==================================[ end ]=================================== + +def bas_unload_script(): + """ Function called when script is unloaded. """ + global bas_config_file + + if bas_config_file: + bas_config_write() + return weechat.WEECHAT_RC_OK