[weechat] rm
change
commit 308e16b926b02e7ff811ee5cbcb94ebbb65c4361
author Alpha Chen <alpha@kejadlen.dev>
date
parent e23c227b
diff --git a/.weechat/.gitignore b/.weechat/.gitignore
deleted file mode 100644
index 541e52da..00000000
--- a/.weechat/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-urlserver_list.txt
diff --git a/.weechat/alias.conf b/.weechat/alias.conf
deleted file mode 100644
index 6252f238..00000000
--- a/.weechat/alias.conf
+++ /dev/null
@@ -1,49 +0,0 @@
-#
-# weechat -- alias.conf
-#
-# WARNING: It is NOT recommended to edit this file by hand,
-# especially if WeeChat is running.
-#
-# Use /set or similar command to change settings in WeeChat.
-#
-# For more info, see: https://weechat.org/doc/quickstart
-#
-
-[cmd]
-AAWAY = "allserv /away"
-AME = "allchan /me"
-AMSG = "allchan /msg *"
-ANICK = "allserv /nick"
-BEEP = "print -beep"
-BYE = "quit"
-C = "buffer clear"
-CHAT = "dcc chat"
-CL = "buffer clear"
-CLOSE = "buffer close"
-EXIT = "quit"
-IG = "ignore"
-J = "join"
-K = "kick"
-KB = "kickban"
-LEAVE = "part"
-M = "msg"
-MSGBUF = "command -buffer $1 * /input send $2-"
-MUB = "unban *"
-N = "names"
-Q = "query"
-REDRAW = "window refresh"
-SAY = "msg *"
-SIGNOFF = "quit"
-T = "topic"
-UB = "unban"
-UMODE = "mode $nick"
-V = "command core version"
-W = "who"
-WC = "window merge"
-WI = "whois"
-WII = "whois $1 $1"
-WW = "whowas"
-znc = "/quote znc"
-
-[completion]
-MSGBUF = "%(buffers_plugins_names)"
diff --git a/.weechat/aspell.conf b/.weechat/aspell.conf
deleted file mode 100644
index 27b16b83..00000000
--- a/.weechat/aspell.conf
+++ /dev/null
@@ -1,33 +0,0 @@
-#
-# weechat -- aspell.conf
-#
-# WARNING: It is NOT recommended to edit this file by hand,
-# especially if WeeChat is running.
-#
-# Use /set or similar command to change settings in WeeChat.
-#
-# For more info, see: https://weechat.org/doc/quickstart
-#
-
-[color]
-misspelled = lightred
-suggestion = default
-suggestion_delimiter_dict = cyan
-suggestion_delimiter_word = cyan
-
-[check]
-commands = "ame,amsg,away,command,cycle,kick,kickban,me,msg,notice,part,query,quit,topic"
-default_dict = ""
-during_search = off
-enabled = off
-real_time = off
-suggestions = -1
-word_min_length = 2
-
-[dict]
-
-[look]
-suggestion_delimiter_dict = " / "
-suggestion_delimiter_word = ","
-
-[option]
diff --git a/.weechat/autosort.conf b/.weechat/autosort.conf
deleted file mode 100644
index 9718abe9..00000000
--- a/.weechat/autosort.conf
+++ /dev/null
@@ -1,18 +0,0 @@
-#
-# weechat -- autosort.conf
-#
-# WARNING: It is NOT recommended to edit this file by hand,
-# especially if WeeChat is running.
-#
-# Use /set or similar command to change settings in WeeChat.
-#
-# For more info, see: https://weechat.org/doc/quickstart
-#
-
-[sorting]
-case_sensitive = off
-group_irc = on
-replacements = "[["##", "#"], ["##", "#"]]"
-rules = "[["core", 0], ["irc", 2], ["*", 1], ["irc.irc_raw", 0], ["irc.server", 1], ["irc.server.*.&*", 0], ["irc.server.*.#*", 1], ["irc.server.*.\\*status", 2]]"
-signals = "buffer_opened buffer_merged buffer_unmerged buffer_renamed"
-sort_on_config_change = on
diff --git a/.weechat/buffers.conf b/.weechat/buffers.conf
deleted file mode 100644
index 118f2abd..00000000
--- a/.weechat/buffers.conf
+++ /dev/null
@@ -1,80 +0,0 @@
-#
-# weechat -- buffers.conf
-#
-# WARNING: It is NOT recommended to edit this file by hand,
-# especially if WeeChat is running.
-#
-# Use /set or similar command to change settings in WeeChat.
-#
-# For more info, see: https://weechat.org/doc/quickstart
-#
-
-[color]
-current_bg = lightred
-current_fg = yellow
-default_bg = default
-default_fg = default
-hotlist_highlight_bg = default
-hotlist_highlight_fg = black
-hotlist_low_bg = default
-hotlist_low_fg = white
-hotlist_message_bg = default
-hotlist_message_fg = red
-hotlist_private_bg = default
-hotlist_private_fg = lightgreen
-none_channel_bg = default
-none_channel_fg = default
-number = lightgreen
-number_char = lightgreen
-prefix_bufname = default
-queries_default_bg = default
-queries_default_fg = default
-queries_highlight_bg = default
-queries_highlight_fg = default
-queries_message_bg = default
-queries_message_fg = default
-suffix_bufname = default
-whitelist_default_bg = default
-whitelist_default_fg = default
-whitelist_highlight_bg = default
-whitelist_highlight_fg = default
-whitelist_low_bg = default
-whitelist_low_fg = default
-whitelist_message_bg = default
-whitelist_message_fg = default
-whitelist_private_bg = default
-whitelist_private_fg = default
-
-[look]
-core_to_front = off
-detach = 600
-detach_buffer_immediately = ""
-detach_buffer_immediately_level = 2
-detach_display_window_number = off
-detach_displayed_buffers = on
-detach_free_content = off
-detach_query = off
-hide_merged_buffers = server
-hotlist_counter = off
-immune_detach_buffers = ""
-indenting = on
-indenting_amount = 2
-indenting_number = on
-jump_prev_next_visited_buffer = off
-mark_inactive = off
-mouse_move_buffer = on
-mouse_wheel = on
-name_crop_suffix = "+"
-name_size_max = 0
-number_char = "."
-prefix = off
-prefix_bufname = ""
-prefix_empty = on
-prefix_for_query = ""
-short_names = on
-show_lag = off
-show_number = on
-sort = number
-suffix_bufname = ""
-toggle_bar = on
-whitelist_buffers = ""
diff --git a/.weechat/buflist.conf b/.weechat/buflist.conf
deleted file mode 100644
index b8bc5a33..00000000
--- a/.weechat/buflist.conf
+++ /dev/null
@@ -1,38 +0,0 @@
-#
-# weechat -- buflist.conf
-#
-# WARNING: It is NOT recommended to edit this file by hand,
-# especially if WeeChat is running.
-#
-# Use /set or similar command to change settings in WeeChat.
-#
-# For more info, see: https://weechat.org/doc/quickstart
-#
-
-[look]
-auto_scroll = 50
-display_conditions = "${buffer.active}==1 && ${buffer.hidden}==0"
-enabled = on
-mouse_jump_visited_buffer = off
-mouse_move_buffer = on
-mouse_wheel = on
-nick_prefix = off
-nick_prefix_empty = on
-signals_refresh = ""
-sort = "number,-active"
-
-[format]
-buffer = "${format_number}${indent}${format_nick_prefix}${color_hotlist}${format_name}"
-buffer_current = "${color:,blue}${format_buffer}"
-hotlist = " ${color:green}(${hotlist}${color:green})"
-hotlist_highlight = "${color:magenta}"
-hotlist_low = "${color:white}"
-hotlist_message = "${color:brown}"
-hotlist_none = "${color:default}"
-hotlist_private = "${color:green}"
-hotlist_separator = "${color:default},"
-indent = "  "
-lag = " ${color:green}[${color:brown}${lag}${color:green}]"
-name = "${name}"
-nick_prefix = "${color_nick_prefix}${nick_prefix}"
-number = "${color:green}${number}${if:${number_displayed}?.: }"
diff --git a/.weechat/charset.conf b/.weechat/charset.conf
deleted file mode 100644
index 00d304cd..00000000
--- a/.weechat/charset.conf
+++ /dev/null
@@ -1,18 +0,0 @@
-#
-# weechat -- charset.conf
-#
-# WARNING: It is NOT recommended to edit this file by hand,
-# especially if WeeChat is running.
-#
-# Use /set or similar command to change settings in WeeChat.
-#
-# For more info, see: https://weechat.org/doc/quickstart
-#
-
-[default]
-decode = "iso-8859-1"
-encode = ""
-
-[decode]
-
-[encode]
diff --git a/.weechat/colorize_nicks.conf b/.weechat/colorize_nicks.conf
deleted file mode 100644
index 6c880170..00000000
--- a/.weechat/colorize_nicks.conf
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# weechat -- colorize_nicks.conf
-#
-# WARNING: It is NOT recommended to edit this file by hand,
-# especially if WeeChat is running.
-#
-# Use /set or similar command to change settings in WeeChat.
-#
-# For more info, see: https://weechat.org/doc/quickstart
-#
-
-[look]
-blacklist_channels = ""
-blacklist_nicks = "so,root"
-colorize_input = off
-greedy_matching = on
-ignore_nicks_in_urls = off
-ignore_tags = ""
-min_nick_length = 2
diff --git a/.weechat/exec.conf b/.weechat/exec.conf
deleted file mode 100644
index 519ccc1b..00000000
--- a/.weechat/exec.conf
+++ /dev/null
@@ -1,18 +0,0 @@
-#
-# weechat -- exec.conf
-#
-# WARNING: It is NOT recommended to edit this file by hand,
-# especially if WeeChat is running.
-#
-# Use /set or similar command to change settings in WeeChat.
-#
-# For more info, see: https://weechat.org/doc/quickstart
-#
-
-[command]
-default_options = ""
-purge_delay = 0
-
-[color]
-flag_finished = lightred
-flag_running = lightgreen
diff --git a/.weechat/fifo.conf b/.weechat/fifo.conf
deleted file mode 100644
index 904985df..00000000
--- a/.weechat/fifo.conf
+++ /dev/null
@@ -1,14 +0,0 @@
-#
-# weechat -- fifo.conf
-#
-# WARNING: It is NOT recommended to edit this file by hand,
-# especially if WeeChat is running.
-#
-# Use /set or similar command to change settings in WeeChat.
-#
-# For more info, see: https://weechat.org/doc/quickstart
-#
-
-[file]
-enabled = on
-path = "%h/weechat_fifo"
diff --git a/.weechat/irc.conf b/.weechat/irc.conf
deleted file mode 100644
index 8ad50251..00000000
--- a/.weechat/irc.conf
+++ /dev/null
@@ -1,311 +0,0 @@
-#
-# weechat -- irc.conf
-#
-# WARNING: It is NOT recommended to edit this file by hand,
-# especially if WeeChat is running.
-#
-# Use /set or similar command to change settings in WeeChat.
-#
-# For more info, see: https://weechat.org/doc/quickstart
-#
-
-[look]
-buffer_open_before_autojoin = on
-buffer_open_before_join = off
-buffer_switch_autojoin = off
-buffer_switch_join = on
-color_nicks_in_names = off
-color_nicks_in_nicklist = off
-color_nicks_in_server_messages = on
-color_pv_nick_like_channel = on
-ctcp_time_format = "%a, %d %b %Y %T %z"
-display_away = local
-display_ctcp_blocked = on
-display_ctcp_reply = on
-display_ctcp_unknown = on
-display_host_join = on
-display_host_join_local = on
-display_host_quit = on
-display_join_message = ""
-display_old_topic = on
-display_pv_away_once = on
-display_pv_back = on
-highlight_channel = "$nick"
-highlight_pv = "$nick"
-highlight_server = "$nick"
-highlight_tags_restrict = "irc_privmsg,irc_notice"
-item_channel_modes_hide_args = "k"
-item_display_server = buffer_plugin
-item_nick_modes = on
-item_nick_prefix = on
-join_auto_add_chantype = off
-msgbuffer_fallback = current
-new_channel_position = none
-new_pv_position = none
-nick_completion_smart = speakers
-nick_mode = prefix
-nick_mode_empty = off
-nicks_hide_password = "nickserv"
-notice_as_pv = auto
-notice_welcome_redirect = on
-notice_welcome_tags = ""
-notify_tags_ison = "notify_message"
-notify_tags_whois = "notify_message"
-part_closes_buffer = off
-pv_buffer = independent
-pv_tags = "notify_private"
-raw_messages = 256
-server_buffer = independent
-smart_filter = on
-smart_filter_delay = 5
-smart_filter_join = on
-smart_filter_join_unmask = 30
-smart_filter_mode = "+"
-smart_filter_nick = on
-smart_filter_quit = on
-temporary_servers = off
-topic_strip_colors = off
-
-[color]
-input_nick = lightcyan
-item_channel_modes = default
-item_lag_counting = default
-item_lag_finished = yellow
-item_nick_modes = default
-message_join = green
-message_quit = red
-mirc_remap = "1,-1:darkgray"
-nick_prefixes = "y:lightred;q:lightred;a:lightcyan;o:lightgreen;h:lightmagenta;v:yellow;*:lightblue"
-notice = green
-reason_quit = default
-topic_current = default
-topic_new = white
-topic_old = default
-
-[network]
-autoreconnect_delay_growing = 2
-autoreconnect_delay_max = 600
-ban_mask_default = "*!$ident@$host"
-channel_encode = off
-colors_receive = on
-colors_send = on
-lag_check = 60
-lag_max = 1800
-lag_min_show = 500
-lag_reconnect = 0
-lag_refresh_interval = 1
-notify_check_ison = 1
-notify_check_whois = 5
-sasl_fail_unavailable = on
-send_unknown_commands = off
-whois_double_nick = off
-
-[msgbuffer]
-
-[ctcp]
-
-[ignore]
-
-[server_default]
-addresses = ""
-anti_flood_prio_high = 2
-anti_flood_prio_low = 2
-autoconnect = off
-autojoin = ""
-autoreconnect = on
-autoreconnect_delay = 10
-autorejoin = off
-autorejoin_delay = 30
-away_check = 0
-away_check_max_nicks = 25
-capabilities = ""
-command = ""
-command_delay = 0
-connection_timeout = 60
-ipv6 = on
-local_hostname = ""
-msg_kick = ""
-msg_part = "WeeChat ${info:version}"
-msg_quit = "WeeChat ${info:version}"
-nicks = "alpha,alpha1,alpha2,alpha3,alpha4"
-nicks_alternate = on
-notify = ""
-password = ""
-proxy = ""
-realname = ""
-sasl_fail = continue
-sasl_key = ""
-sasl_mechanism = plain
-sasl_password = ""
-sasl_timeout = 15
-sasl_username = ""
-ssl = off
-ssl_cert = ""
-ssl_dhkey_size = 2048
-ssl_fingerprint = ""
-ssl_priorities = "NORMAL:-VERS-SSL3.0"
-ssl_verify = on
-usermode = ""
-username = "alpha"
-
-[server]
-alydipha.addresses = "congenital-optimist.arbitrarydefinitions.com/6667"
-alydipha.proxy
-alydipha.ipv6
-alydipha.ssl = on
-alydipha.ssl_cert
-alydipha.ssl_priorities
-alydipha.ssl_dhkey_size
-alydipha.ssl_fingerprint = "83c4109c714c9f336963cdd3d5a4f95d0e20c1658c45b092d950a963c06a9fa272ed15eb9b642fc46700617d776d6a702da995d1b5eff7e5447f767ec33c9665"
-alydipha.ssl_verify
-alydipha.password = "${sec.data.znc}"
-alydipha.capabilities
-alydipha.sasl_mechanism
-alydipha.sasl_username
-alydipha.sasl_password
-alydipha.sasl_key
-alydipha.sasl_timeout
-alydipha.sasl_fail
-alydipha.autoconnect = on
-alydipha.autoreconnect
-alydipha.autoreconnect_delay
-alydipha.nicks
-alydipha.nicks_alternate
-alydipha.username = "alpha/alydipha"
-alydipha.realname
-alydipha.local_hostname
-alydipha.usermode
-alydipha.command
-alydipha.command_delay
-alydipha.autojoin
-alydipha.autorejoin
-alydipha.autorejoin_delay
-alydipha.connection_timeout
-alydipha.anti_flood_prio_high
-alydipha.anti_flood_prio_low
-alydipha.away_check
-alydipha.away_check_max_nicks
-alydipha.msg_kick
-alydipha.msg_part
-alydipha.msg_quit
-alydipha.notify
-cloudfoundry.addresses = "congenital-optimist.arbitrarydefinitions.com/6667"
-cloudfoundry.proxy
-cloudfoundry.ipv6
-cloudfoundry.ssl = on
-cloudfoundry.ssl_cert
-cloudfoundry.ssl_priorities
-cloudfoundry.ssl_dhkey_size
-cloudfoundry.ssl_fingerprint = "83c4109c714c9f336963cdd3d5a4f95d0e20c1658c45b092d950a963c06a9fa272ed15eb9b642fc46700617d776d6a702da995d1b5eff7e5447f767ec33c9665"
-cloudfoundry.ssl_verify
-cloudfoundry.password = "${sec.data.znc}"
-cloudfoundry.capabilities
-cloudfoundry.sasl_mechanism
-cloudfoundry.sasl_username
-cloudfoundry.sasl_password
-cloudfoundry.sasl_key
-cloudfoundry.sasl_timeout
-cloudfoundry.sasl_fail
-cloudfoundry.autoconnect = on
-cloudfoundry.autoreconnect
-cloudfoundry.autoreconnect_delay
-cloudfoundry.nicks
-cloudfoundry.nicks_alternate
-cloudfoundry.username = "alpha/cloudfoundry"
-cloudfoundry.realname
-cloudfoundry.local_hostname
-cloudfoundry.usermode
-cloudfoundry.command
-cloudfoundry.command_delay
-cloudfoundry.autojoin
-cloudfoundry.autorejoin
-cloudfoundry.autorejoin_delay
-cloudfoundry.connection_timeout
-cloudfoundry.anti_flood_prio_high
-cloudfoundry.anti_flood_prio_low
-cloudfoundry.away_check
-cloudfoundry.away_check_max_nicks
-cloudfoundry.msg_kick
-cloudfoundry.msg_part
-cloudfoundry.msg_quit
-cloudfoundry.notify
-pivotal.addresses = "congenital-optimist.arbitrarydefinitions.com/6667"
-pivotal.proxy
-pivotal.ipv6
-pivotal.ssl = on
-pivotal.ssl_cert
-pivotal.ssl_priorities
-pivotal.ssl_dhkey_size
-pivotal.ssl_fingerprint = "83c4109c714c9f336963cdd3d5a4f95d0e20c1658c45b092d950a963c06a9fa272ed15eb9b642fc46700617d776d6a702da995d1b5eff7e5447f767ec33c9665"
-pivotal.ssl_verify
-pivotal.password = "${sec.data.znc}"
-pivotal.capabilities
-pivotal.sasl_mechanism
-pivotal.sasl_username
-pivotal.sasl_password
-pivotal.sasl_key
-pivotal.sasl_timeout
-pivotal.sasl_fail
-pivotal.autoconnect = on
-pivotal.autoreconnect
-pivotal.autoreconnect_delay
-pivotal.nicks
-pivotal.nicks_alternate
-pivotal.username = "alpha/pivotal"
-pivotal.realname
-pivotal.local_hostname
-pivotal.usermode
-pivotal.command
-pivotal.command_delay
-pivotal.autojoin
-pivotal.autorejoin
-pivotal.autorejoin_delay
-pivotal.connection_timeout
-pivotal.anti_flood_prio_high
-pivotal.anti_flood_prio_low
-pivotal.away_check
-pivotal.away_check_max_nicks
-pivotal.msg_kick
-pivotal.msg_part
-pivotal.msg_quit
-pivotal.notify
-mozilla.addresses = "congenital-optimist.arbitrarydefinitions.com/6667"
-mozilla.proxy
-mozilla.ipv6
-mozilla.ssl = on
-mozilla.ssl_cert
-mozilla.ssl_priorities
-mozilla.ssl_dhkey_size
-mozilla.ssl_fingerprint = "83c4109c714c9f336963cdd3d5a4f95d0e20c1658c45b092d950a963c06a9fa272ed15eb9b642fc46700617d776d6a702da995d1b5eff7e5447f767ec33c9665"
-mozilla.ssl_verify
-mozilla.password = "${sec.data.znc}"
-mozilla.capabilities
-mozilla.sasl_mechanism
-mozilla.sasl_username
-mozilla.sasl_password
-mozilla.sasl_key
-mozilla.sasl_timeout
-mozilla.sasl_fail
-mozilla.autoconnect = on
-mozilla.autoreconnect
-mozilla.autoreconnect_delay
-mozilla.nicks
-mozilla.nicks_alternate
-mozilla.username = "alpha/mozilla"
-mozilla.realname
-mozilla.local_hostname
-mozilla.usermode
-mozilla.command
-mozilla.command_delay
-mozilla.autojoin = "#rust,#rust-beginners"
-mozilla.autorejoin
-mozilla.autorejoin_delay
-mozilla.connection_timeout
-mozilla.anti_flood_prio_high
-mozilla.anti_flood_prio_low
-mozilla.away_check
-mozilla.away_check_max_nicks
-mozilla.msg_kick
-mozilla.msg_part
-mozilla.msg_quit
-mozilla.notify
diff --git a/.weechat/iset.conf b/.weechat/iset.conf
deleted file mode 100644
index 35e1653a..00000000
--- a/.weechat/iset.conf
+++ /dev/null
@@ -1,37 +0,0 @@
-#
-# weechat -- iset.conf
-#
-# WARNING: It is NOT recommended to edit this file by hand,
-# especially if WeeChat is running.
-#
-# Use /set or similar command to change settings in WeeChat.
-#
-# For more info, see: https://weechat.org/doc/quickstart
-#
-
-[color]
-bg_selected = red
-help_default_value = green
-help_option_name = white
-help_text = default
-option = default
-option_selected = white
-type = brown
-type_selected = yellow
-value = cyan
-value_diff = magenta
-value_diff_selected = lightmagenta
-value_selected = lightcyan
-value_undef = green
-value_undef_selected = lightgreen
-
-[help]
-show_help_bar = on
-show_help_extra_info = on
-show_plugin_description = off
-
-[look]
-scroll_horiz = 10
-show_current_line = on
-use_mute = off
-value_search_char = "="
diff --git a/.weechat/logger.conf b/.weechat/logger.conf
deleted file mode 100644
index 09b543ed..00000000
--- a/.weechat/logger.conf
+++ /dev/null
@@ -1,33 +0,0 @@
-#
-# weechat -- logger.conf
-#
-# WARNING: It is NOT recommended to edit this file by hand,
-# especially if WeeChat is running.
-#
-# Use /set or similar command to change settings in WeeChat.
-#
-# For more info, see: https://weechat.org/doc/quickstart
-#
-
-[look]
-backlog = 20
-
-[color]
-backlog_end = default
-backlog_line = default
-
-[file]
-auto_log = on
-flush_delay = 120
-info_lines = off
-mask = "$plugin.$name.weechatlog"
-name_lower_case = on
-nick_prefix = ""
-nick_suffix = ""
-path = "%h/logs/"
-replacement_char = "_"
-time_format = "%Y-%m-%d %H:%M:%S"
-
-[level]
-
-[mask]
diff --git a/.weechat/perl/autoload/highmon.pl b/.weechat/perl/autoload/highmon.pl
deleted file mode 120000
index 2eb5e1e5..00000000
--- a/.weechat/perl/autoload/highmon.pl
+++ /dev/null
@@ -1 +0,0 @@
-../highmon.pl
\ No newline at end of file
diff --git a/.weechat/perl/autoload/iset.pl b/.weechat/perl/autoload/iset.pl
deleted file mode 120000
index 2746e0d8..00000000
--- a/.weechat/perl/autoload/iset.pl
+++ /dev/null
@@ -1 +0,0 @@
-../iset.pl
\ No newline at end of file
diff --git a/.weechat/perl/autoload/perlexec.pl b/.weechat/perl/autoload/perlexec.pl
deleted file mode 120000
index dcfce2f1..00000000
--- a/.weechat/perl/autoload/perlexec.pl
+++ /dev/null
@@ -1 +0,0 @@
-../perlexec.pl
\ No newline at end of file
diff --git a/.weechat/perl/highmon.pl b/.weechat/perl/highmon.pl
deleted file mode 100644
index 1c077125..00000000
--- a/.weechat/perl/highmon.pl
+++ /dev/null
@@ -1,1139 +0,0 @@
-#
-# highmon.pl - Highlight Monitoring for weechat 0.3.0
-# Version 2.5
-#
-# Add 'Highlight Monitor' buffer/bar to log all highlights in one spot
-#
-# Usage:
-# /highmon [help] | [monitor [channel [server]]] | [clean default|orphan|all] | clearbar
-#  Command wrapper for highmon commands
-#
-# /highmon clean default|orphan|all will clean the config section of default 'on' entries,
-#  channels you are no longer joined, or both
-#
-# /highmon clearbar will clear the contents of highmon's bar output
-#
-# /highmon monitor [channel] [server] is used to toggle a highlight monitoring on and off, this
-#  can be used in the channel buffer for the channel you wish to toggle, or be given
-#  with arguments e.g. /highmon monitor #weechat freenode
-#
-# /set plugins.var.perl.highmon.alignment
-#  The config setting "alignment" can be changed to;
-#  "channel", "schannel", "nchannel", "channel,nick", "schannel,nick", "nchannel,nick"
-#  to change how the monitor appears
-#  The 'channel'  value will show: "#weechat"
-#  The 'schannel' value will show: "6"
-#  The 'nchannel' value will show: "6:#weechat"
-#
-# /set plugins.var.perl.highmon.short_names
-#  Setting this to 'on' will trim the network name from highmon, ala buffers.pl
-#
-# /set plugins.var.perl.highmon.merge_private
-#  Setting this to 'on' will merge private messages to highmon's display
-#
-# /set plugins.var.perl.highmon.color_buf
-#  This turns colored buffer names on or off, you can also set a single fixed color by using a weechat color name.
-#  This *must* be a valid color name, or weechat will likely do unexpected things :)
-#
-# /set plugins.var.perl.highmon.hotlist_show
-#  Setting this to 'on' will let the highmon buffer appear in hotlists
-#  (status bar/buffer.pl)
-#
-# /set plugins.var.perl.highmon.away_only
-#  Setting this to 'on' will only put messages in the highmon buffer when
-#  you set your status to away
-#
-# /set plugins.var.perl.highmon.logging
-#  Toggles logging status for highmon buffer (default: off)
-#
-# /set plugins.var.perl.highmon.output
-#  Changes where output method of highmon; takes either "bar" or "buffer" (default; buffer)
-# /set plugins.var.perl.highmon.bar_lines
-#  Changes the amount of lines the output bar will hold.
-#  (Only appears once output has been set to bar, defaults to 10)
-# /set plugins.var.perl.highmon.bar_scrolldown
-#  Toggles the bar scrolling at the bottom when new highlights are received
-#  (Only appears once output has been set to bar, defaults to off)
-#
-# /set plugins.var.perl.highmon.nick_prefix
-# /set plugins.var.perl.highmon.nick_suffix
-#  Sets the prefix and suffix chars in the highmon buffer
-#  (Defaults to <> if nothing set, and blank if there is)
-#
-# servername.#channel
-#  servername is the internal name for the server (set when you use /server add)
-#  #channel is the channel name, (where # is whatever channel type that channel happens to be)
-#
-# Optional, set up tweaks; Hide the status and input lines on highmon
-#
-# /set weechat.bar.status.conditions "${window.buffer.full_name} != perl.highmon"
-# /set weechat.bar.input.conditions "${window.buffer.full_name} != perl.highmon"
-#
-
-# Bugs and feature requests at: https://github.com/KenjiE20/highmon
-
-# History:
-# 2014-08-16, KenjiE20 <longbow@longbowslair.co.uk>:
-#	v2.5:	-add: clearbar command to clear bar output
-#			-add: firstrun output prompt to check the help text for set up hints as they were being missed
-#			and update hint for conditions to use eval
-#			-change: Make all outputs use the date callback for more accurate timestamps (thanks Germainz)
-# 2013-12-04, KenjiE20 <longbow@longbowslair.co.uk>:
-#	v2.4:	-add: Support for eval style colour codes in time format used for bar output
-# 2013-10-22, KenjiE20 <longbow@longbowslair.co.uk>:
-#	v2.3.3.2:	-fix: Typo in fix command
-# 2013-10-10, KenjiE20 <longbow@longbowslair.co.uk>:
-#	v2.3.3.1:	-fix: Typo in closed buffer warning
-# 2013-10-07, KenjiE20 <longbow@longbowslair.co.uk>:
-#	v2.3.3:	-add: Warning and fixer for accidental buffer closes
-# 2013-01-15, KenjiE20 <longbow@longbowslair.co.uk>:
-#	v2.3.2:	-fix: Let bar output use the string set in weechat's config option
-#			-add: github info
-# 2012-04-15, KenjiE20 <longbow@longbowslair.co.uk>:
-#	v2.3.1:	-fix: Colour tags in bar timestamp string
-# 2012-02-28, KenjiE20 <longbow@longbowslair.co.uk>:
-#	v2.3:	-feature: Added merge_private option to display private messages (default: off)
-#			-fix: Channel name colours now show correctly when set to on
-# 2011-08-07, Sitaktif <romainchossart_at_gmail.com>:
-#	v2.2.1:	-feature: Add "bar_scrolldown" option to have the bar display the latest hl at anytime
-#			-fix: Set up bar-specific config at startup if 'output' is already configured as 'bar'
-# 2010-12-22, KenjiE20 <longbow@longbowslair.co.uk>:
-#	v2.2:	-change: Use API instead of config to find channel colours, ready for 0.3.4 and 256 colours
-# 2010-12-13, idl0r & KenjiE20 <longbow@longbowslair.co.uk>:
-#	v2.1.3:	-fix: perl errors caused by bar line counter
-#			-fix: Add command list to inbuilt help
-# 2010-09-30, KenjiE20 <longbow@longbowslair.co.uk>:
-#	v2.1.2:	-fix: logging config was not correctly toggling back on (thanks to sleo for noticing)
-#			-version sync w/ chanmon
-# 2010-08-27, KenjiE20 <longbow@longbowslair.co.uk>:
-#	v2.1: -feature: Add 'nchannel' option to alignment to display buffer and name
-# 2010-04-25, KenjiE20 <longbow@longbowslair.co.uk>:
-#	v2.0:	Release as version 2.0
-# 2010-04-24, KenjiE20 <longbow@longbowslair.co.uk>:
-#	v1.9:	Rewrite for v2.0
-#		Bring feature set in line with chanmon 2.0
-#		-code change: Made more subs to shrink the code down in places
-#		-fix: Stop highmon attempting to double load/hook
-#		-fix: Add version dependant check for away status
-# 2010-01-25, KenjiE20 <longbow@longbowslair.co.uk>:
-#       v1.7:   -fixture: Let highmon be aware of nick_prefix/suffix
-#                       and allow custom prefix/suffix for chanmon buffer
-#                       (Defaults to <> if nothing set, and blank if there is)
-#               (Thanks to m4v for these)
-# 2009-09-07, KenjiE20 <longbow@longbowslair.co.uk>:
-#	v1.6:	-feature: colored buffer names
-#		-change: version sync with chanmon
-# 2009-09-05, KenjiE20 <longbow@longbowslair.co.uk>:
-#	v1.2:	-fix: disable buffer highlight
-# 2009-09-02, KenjiE20 <longbow@longbowslair.co.uk>:
-#	v.1.1.1	-change: Stop unsightly text block on '/help'
-# 2009-08-10, KenjiE20 <longbow@longbowslair.co.uk>:
-#	v1.1:	In-client help added
-# 2009-08-02, KenjiE20 <longbow@longbowslair.co.uk>:
-#	v1.0:	Initial Public Release
-
-# Copyright (c) 2009 by KenjiE20 <longbow@longbowslair.co.uk>
-#
-# 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 <http://www.gnu.org/licenses/>.
-#
-
-@bar_lines = ();
-@bar_lines_time = ();
-# Replicate info earlier for in-client help
-
-$highmonhelp = weechat::color("bold")."/highmon [help] | [monitor [channel [server]]] | [clean default|orphan|all] | clearbar".weechat::color("-bold")."
- Command wrapper for highmon commands
-
-".weechat::color("bold")."/highmon clean default|orphan|all".weechat::color("-bold")." will clean the config section of default 'on' entries, channels you are no longer joined, or both
-
-".weechat::color("bold")."/highmon clearbar".weechat::color("-bold")." will clear the contents of highmon's bar output
-
-".weechat::color("bold")."/highmon monitor [channel] [server]".weechat::color("-bold")." is used to toggle a highlight monitoring on and off, this can be used in the channel buffer for the channel you wish to toggle, or be given with arguments e.g. /highmon monitor #weechat freenode
-
-".weechat::color("bold")."/set plugins.var.perl.highmon.alignment".weechat::color("-bold")."
- The config setting \"alignment\" can be changed to;
- \"channel\", \"schannel\", \"nchannel\", \"channel,nick\", \"schannel,nick\", \"nchannel,nick\"
- to change how the monitor appears
- The 'channel'  value will show: \"#weechat\"
- The 'schannel' value will show: \"6\"
- The 'nchannel' value will show: \"6:#weechat\"
-
-".weechat::color("bold")."/set plugins.var.perl.highmon.short_names".weechat::color("-bold")."
- Setting this to 'on' will trim the network name from highmon, ala buffers.pl
-
-".weechat::color("bold")."/set plugins.var.perl.highmon.merge_private".weechat::color("-bold")."
- Setting this to 'on' will merge private messages to highmon's display
-
-".weechat::color("bold")."/set plugins.var.perl.highmon.color_buf".weechat::color("-bold")."
- This turns colored buffer names on or off, you can also set a single fixed color by using a weechat color name.
- This ".weechat::color("bold")."must".weechat::color("-bold")." be a valid color name, or weechat will likely do unexpected things :)
-
-".weechat::color("bold")."/set plugins.var.perl.highmon.hotlist_show".weechat::color("-bold")."
-Setting this to 'on' will let the highmon buffer appear in hotlists (status bar/buffer.pl)
-
-".weechat::color("bold")."/set plugins.var.perl.highmon.away_only".weechat::color("-bold")."
-Setting this to 'on' will only put messages in the highmon buffer when you set your status to away
-
-".weechat::color("bold")."/set plugins.var.perl.highmon.logging".weechat::color("-bold")."
- Toggles logging status for highmon buffer (default: off)
-
-".weechat::color("bold")."/set plugins.var.perl.highmon.output".weechat::color("-bold")."
- Changes where output method of highmon; takes either \"bar\" or \"buffer\" (default; buffer)
-".weechat::color("bold")."/set plugins.var.perl.highmon.bar_lines".weechat::color("-bold")."
- Changes the amount of lines the output bar will hold.
- (Only appears once output has been set to bar, defaults to 10)
-".weechat::color("bold")."/set plugins.var.perl.highmon.bar_scrolldown".weechat::color("-bold")."
- Toggles the bar scrolling at the bottom when new highlights are received
- (Only appears once output has been set to bar, defaults to off)
-
-".weechat::color("bold")."/set plugins.var.perl.highmon.nick_prefix".weechat::color("-bold")."
-".weechat::color("bold")."/set plugins.var.perl.highmon.nick_suffix".weechat::color("-bold")."
- Sets the prefix and suffix chars in the highmon buffer
- (Defaults to <> if nothing set, and blank if there is)
-
-".weechat::color("bold")."servername.#channel".weechat::color("-bold")."
- servername is the internal name for the server (set when you use /server add)
- #channel is the channel name, (where # is whatever channel type that channel happens to be)
-
-".weechat::color("bold")."Optional, set up tweaks;".weechat::color("-bold")." Hide the status and input lines on highmon
-
-".weechat::color("bold")."/set weechat.bar.status.conditions \"\${window.buffer.full_name} != perl.highmon\"".weechat::color("-bold")."
-".weechat::color("bold")."/set weechat.bar.input.conditions \"\${window.buffer.full_name} != perl.highmon\"".weechat::color("-bold");
-# Print verbose help
-sub print_help
-{
-	weechat::print("", "\t".weechat::color("bold")."Highmon Help".weechat::color("-bold")."\n\n");
-	weechat::print("", "\t".$highmonhelp);
-	return weechat::WEECHAT_RC_OK;
-}
-
-# Bar item build
-sub highmon_bar_build
-{
-	# Get max lines
-	$max_lines = weechat::config_get_plugin("bar_lines");
-	$max_lines = $max_lines ? $max_lines : 10;
-	$str = '';
-	$align_num = 0;
-	$count = 0;
-	# Keep lines within max
-	while ($#bar_lines > $max_lines)
-	{
-		shift(@bar_lines);
-		shift(@bar_lines_time);
-	}
-	# So long as we have some lines, build a string
-	if (@bar_lines)
-	{
-		# Build loop
-		$sep = " ".weechat::config_string(weechat::config_get("weechat.look.prefix_suffix"))." ";
-		foreach(@bar_lines)
-		{
-			# Find max align needed
-			$prefix_num = (index(weechat::string_remove_color($_, ""), $sep));
-			$align_num = $prefix_num if ($prefix_num > $align_num);
-		}
-		foreach(@bar_lines)
-		{
-			# Get align for this line
-			$prefix_num = (index(weechat::string_remove_color($_, ""), $sep));
-
-			# Make string
-			$str = $str.$bar_lines_time[$count]." ".(" " x ($align_num - $prefix_num)).$_."\n";
-			# Increment count for sync with time list
-			$count++;
-		}
-	}
-	return $str;
-}
-
-# Make a new bar
-sub highmon_bar_open
-{
-	# Make the bar item
-	weechat::bar_item_new("highmon", "highmon_bar_build", "");
-
-	$highmon_bar = weechat::bar_new ("highmon", "off", 100, "root", "", "bottom", "vertical", "vertical", 0, 0, "default", "cyan", "default", "on", "highmon");
-
-	return weechat::WEECHAT_RC_OK;
-}
-# Close bar
-sub highmon_bar_close
-{
-	# Find if bar exists
-	$highmon_bar = weechat::bar_search("highmon");
-	# If is does, close it
-	if ($highmon_bar ne "")
-	{
-		weechat::bar_remove($highmon_bar);
-	}
-
-	# Find if bar item exists
-	$highmon_bar_item = weechat::bar_item_search("highmon_bar");
-	# If is does, close it
-	if ($highmon_bar_item ne "")
-	{
-		weechat::bar_remove($highmon_bar_item);
-	}
-
-	@bar_lines = ();
-	return weechat::WEECHAT_RC_OK;
-}
-
-# Make a new buffer
-sub highmon_buffer_open
-{
-	# Search for pre-existing buffer
-	$highmon_buffer = weechat::buffer_search("perl", "highmon");
-
-	# Make a new buffer
-	if ($highmon_buffer eq "")
-	{
-		$highmon_buffer = weechat::buffer_new("highmon", "highmon_buffer_input", "", "highmon_buffer_close", "");
-	}
-
-	# Turn off notify, highlights
-	if ($highmon_buffer ne "")
-	{
-		if (weechat::config_get_plugin("hotlist_show" eq "off"))
-		{
-			weechat::buffer_set($highmon_buffer, "notify", "0");
-		}
-		weechat::buffer_set($highmon_buffer, "highlight_words", "-");
-		weechat::buffer_set($highmon_buffer, "title", "Highlight Monitor");
-		# Set no_log
-		if (weechat::config_get_plugin("logging") eq "off")
-		{
-			weechat::buffer_set($highmon_buffer, "localvar_set_no_log", "1");
-		}
-	}
-	return weechat::WEECHAT_RC_OK;
-}
-# Buffer input has no action
-sub highmon_buffer_input
-{
-	return weechat::WEECHAT_RC_OK;
-}
-# Close up
-sub highmon_buffer_close
-{
-	$highmon_buffer = "";
-	# If user hasn't changed output style warn user
-	if (weechat::config_get_plugin("output") eq "buffer")
-	{
-		weechat::print("", "\tHighmon buffer has been closed but output is still set to buffer, unusual results may occur. To recreate the buffer use ".weechat::color("bold")."/highmon fix".weechat::color("-bold"));
-	}
-	return weechat::WEECHAT_RC_OK;
-}
-
-# Highmon command wrapper
-sub highmon_command_cb
-{
-	$data = $_[0];
-	$buffer = $_[1];
-	$args = $_[2];
-	my $cmd = '';
-	my $arg = '';
-
-	if ($args ne "")
-	{
-		# Split argument up
-		@arg_array = split(/ /,$args);
-		# Take first as command
-		$cmd = shift(@arg_array);
-		# Rebuild string to pass to subs
-		if (@arg_array)
-		{
-			$arg = join(" ", @arg_array);
-		}
-	}
-
-	# Help command
-	if ($cmd eq "" || $cmd eq "help")
-	{
-		print_help();
-	}
-	# /monitor command
-	elsif ($cmd eq "monitor")
-	{
-		highmon_toggle($data, $buffer, $arg);
-	}
-	# /highclean command
-	elsif ($cmd eq "clean")
-	{
-		highmon_config_clean($data, $buffer, $arg);
-	}
-	# clearbar command
-	elsif ($cmd eq "clearbar")
-	{
-		if (weechat::config_get_plugin("output") eq "bar")
-		{
-			@bar_lines = ();
-			weechat::bar_item_update("highmon");
-		}
-	}
-	# Fix closed buffer
-	elsif ($cmd eq "fix")
-	{
-		if (weechat::config_get_plugin("output") eq "buffer" && $highmon_buffer eq "")
-		{
-			highmon_buffer_open();
-		}
-	}
-	return weechat::WEECHAT_RC_OK;
-}
-
-# Clean up config entries
-sub highmon_config_clean
-{
-	$data = $_[0];
-	$buffer = $_[1];
-	$args = $_[2];
-
-	# Don't do anything if bad option given
-	if ($args ne "default" && $args ne "orphan"  && $args ne "all")
-	{
-		weechat::print("", "\thighmon.pl: Unknown option");
-		return weechat::WEECHAT_RC_OK;
-	}
-
-	@chans = ();
-	# Load an infolist of highmon options
-	$infolist = weechat::infolist_get("option", "", "*highmon*");
-	while (weechat::infolist_next($infolist))
-	{
-		$name = weechat::infolist_string($infolist, "option_name");
-		$name =~ s/perl\.highmon\.(\w*)\.([#&\+!])(.*)/$1.$2$3/;
-		if ($name =~ /^(.*)\.([#&\+!])(.*)$/)
-		{
-			$action = 0;
-			# Clean up all 'on's
-			if ($args eq "default" || $args eq "all")
-			{
-				# If value in config is "on"
-				if (weechat::config_get_plugin($name) eq "on")
-				{
-					# Unset and if successful flag as changed
-					$rc = weechat::config_unset_plugin($name);
-					if ($rc eq weechat::WEECHAT_CONFIG_OPTION_UNSET_OK_REMOVED)
-					{
-						$action = 1;
-					}
-				}
-			}
-			# Clean non joined
-			if ($args eq "orphan" || $args eq "all")
-			{
-				# If we can't find the buffer for this entry
-				if (weechat::buffer_search("irc", $name) eq "")
-				{
-					# Unset and if successful flag as changed
-					$rc = weechat::config_unset_plugin($name);
-					if ($rc eq weechat::WEECHAT_CONFIG_OPTION_UNSET_OK_REMOVED)
-					{
-						$action = 1;
-					}
-				}
-			}
-			# Add changed entry names to list
-			push (@chans, $name) if ($action);
-		}
-	}
-	weechat::infolist_free($infolist);
-	# If channels were cleaned from config
-	if (@chans)
-	{
-		# If only one entry
-		if (@chans == 1)
-		{
-			$str = "\thighmon.pl: Cleaned ".@chans." entry from the config:";
-		}
-		else
-		{
-			$str = "\thighmon.pl: Cleaned ".@chans." entries from the config:";
-		}
-		# Build a list of channels
-		foreach(@chans)
-		{
-			$str = $str." ".$_;
-		}
-		# Print what happened
-		weechat::print("",$str);
-	}
-	# Config seemed to be clean
-	else
-	{
-		weechat::print("", "\thighmon.pl: No entries removed");
-	}
-	return weechat::WEECHAT_RC_OK;
-}
-
-# Check config elements
-sub highmon_config_init
-{
-	# First run default
-	if (!(weechat::config_is_set_plugin ("first_run")))
-	{
-		if (weechat::config_get_plugin("first_run") ne "true")
-		{
-			weechat::print("", "\tThis appears to be the first time highmon has been run. For help and common set up hints see /highmon help");
-			weechat::config_set_plugin("first_run", "true");
-		}
-	}
-	# Alignment default
-	if (!(weechat::config_is_set_plugin ("alignment")))
-	{
-		weechat::config_set_plugin("alignment", "channel");
-	}
-	if (weechat::config_get_plugin("alignment") eq "")
-	{
-		weechat::config_set_plugin("alignment", "none");
-	}
-
-	# Short name default
-	if (!(weechat::config_is_set_plugin ("short_names")))
-	{
-		weechat::config_set_plugin("short_names", "off");
-	}
-
-	# Coloured names default
-	if (!(weechat::config_is_set_plugin ("color_buf")))
-	{
-		weechat::config_set_plugin("color_buf", "on");
-	}
-
-	# Hotlist show default
-	if (!(weechat::config_is_set_plugin ("hotlist_show")))
-	{
-		weechat::config_set_plugin("hotlist_show", "off");
-	}
-
-	# Away only default
-	if (!(weechat::config_is_set_plugin ("away_only")))
-	{
-		weechat::config_set_plugin("away_only", "off");
-	}
-
-	# highmon log default
-	if (!(weechat::config_is_set_plugin ("logging")))
-	{
-		weechat::config_set_plugin("logging", "off");
-	}
-
-	# Output default
-	if (!(weechat::config_is_set_plugin ("output")))
-	{
-		weechat::config_set_plugin("output", "buffer");
-	}
-
-	# Private message merging
-	if (!(weechat::config_is_set_plugin ("merge_private")))
-	{
-		weechat::config_set_plugin("merge_private", "off");
-	}
-
-	# Set bar config in case output was set to "bar" before even changing the setting
-	if (weechat::config_get_plugin("output") eq "bar")
-	{
-		# Output bar lines default
-		if (!(weechat::config_is_set_plugin ("bar_lines")))
-		{
-			weechat::config_set_plugin("bar_lines", "10");
-		}
-		if (!(weechat::config_is_set_plugin ("bar_scrolldown")))
-		{
-			weechat::config_set_plugin("bar_scrolldown", "off");
-		}
-	}
-
-	# Check for exisiting prefix/suffix chars, and setup accordingly
-	$prefix = weechat::config_get("irc.look.nick_prefix");
-	$prefix = weechat::config_string($prefix);
-	$suffix = weechat::config_get("irc.look.nick_suffix");
-	$suffix = weechat::config_string($suffix);
-
-	if (!(weechat::config_is_set_plugin("nick_prefix")))
-	{
-		if ($prefix eq "" && $suffix eq "")
-		{
-			weechat::config_set_plugin("nick_prefix", "<");
-		}
-		else
-		{
-			weechat::config_set_plugin("nick_prefix", "");
-		}
-	}
-
-	if (!(weechat::config_is_set_plugin("nick_suffix")))
-	{
-		if ($prefix eq "" && $suffix eq "")
-		{
-			weechat::config_set_plugin("nick_suffix", ">");
-		}
-		else
-		{
-			weechat::config_set_plugin("nick_suffix", "");
-		}
-	}
-}
-
-# Get config updates
-sub highmon_config_cb
-{
-	$point = $_[0];
-	$name = $_[1];
-	$value = $_[2];
-
-	$name =~ s/^plugins\.var\.perl\.highmon\.//;
-
-	# Set logging on buffer
-	if ($name eq "logging")
-	{
-		# Search for pre-existing buffer
-		$highmon_buffer = weechat::buffer_search("perl", "highmon");
-		if ($value eq "off")
-		{
-			weechat::buffer_set($highmon_buffer, "localvar_set_no_log", "1");
-		}
-		else
-		{
-			weechat::buffer_set($highmon_buffer, "localvar_del_no_log", "");
-		}
-	}
-	# Output changer
-	elsif ($name eq "output")
-	{
-		if ($value eq "bar")
-		{
-			# Search for pre-existing buffer
-			$highmon_buffer = weechat::buffer_search("perl", "highmon");
-			# Close if it exists
-			if ($highmon_buffer ne "")
-			{
-				weechat::buffer_close($highmon_buffer)
-			}
-
-			# Output bar lines default
-			if (!(weechat::config_is_set_plugin ("bar_lines")))
-			{
-				weechat::config_set_plugin("bar_lines", "10");
-			}
-			if (!(weechat::config_is_set_plugin ("bar_scrolldown")))
-			{
-				weechat::config_set_plugin("bar_scrolldown", "off");
-			}
-			# Make a bar if doesn't exist
-			highmon_bar_open();
-		}
-		elsif ($value eq "buffer")
-		{
-			# If a bar exists, close it
-			highmon_bar_close();
-			# Open buffer
-			highmon_buffer_open();
-		}
-
-	}
-	# Change if hotlist config changes
-	elsif ($name eq "hotlist_show")
-	{
-		# Search for pre-existing buffer
-		$highmon_buffer = weechat::buffer_search("perl", "highmon");
-		if ($value eq "off" && $highmon_buffer)
-		{
-			weechat::buffer_set($highmon_buffer, "notify", "0");
-		}
-		elsif ($value ne "off" && $highmon_buffer)
-		{
-			weechat::buffer_set($highmon_buffer, "notify", "3");
-		}
-	}
-	elsif ($name eq "weechat.look.prefix_suffix")
-	{
-		if (weechat::config_get_plugin("output") eq "bar")
-		{
-			@bar_lines = ();
-			weechat::print("", "\thighmon: weechat.look.prefix_suffix changed, clearing highmon bar");
-			weechat::bar_item_update("highmon");
-		}
-	}
-	return weechat::WEECHAT_RC_OK;
-}
-
-# Set up weechat hooks / commands
-sub highmon_hook
-{
-	weechat::hook_print("", "", "", 0, "highmon_new_message", "");
-	weechat::hook_command("highclean", "Highmon config clean up", "default|orphan|all", " default: Cleans all config entries with the default \"on\" value\n  orphan: Cleans all config entries for channels you aren't currently joined\n     all: Does both defaults and orphan", "default|orphan|all", "highmon_config_clean", "");
-
-	weechat::hook_command("highmon", "Highmon help", "[help] | [monitor [channel [server]]] | [clean default|orphan|all] | clearbar", "    help: Print help on config options for highmon\n monitor: Toggles monitoring for a channel\n   clean: Highmon config clean up (/highclean)\nclearbar: Clear Highmon bar", "help || monitor %(irc_channels) %(irc_servers) || clean default|orphan|all || clearbar", "highmon_command_cb", "");
-
-	weechat::hook_config("plugins.var.perl.highmon.*", "highmon_config_cb", "");
-	weechat::hook_config("weechat.look.prefix_suffix", "highmon_config_cb", "");
-}
-
-# Main body, Callback for hook_print
-sub highmon_new_message
-{
-	my $net = "";
-	my $chan = "";
-	my $nick = "";
-	my $outstr = "";
-	my $window_displayed = "";
-	my $dyncheck = "0";
-
-#	DEBUG point
-#	$string = "\t"."0: ".$_[0]." 1: ".$_[1]." 2: ".$_[2]." 3: ".$_[3]." 4: ".$_[4]." 5: ".$_[5]." 6: ".$_[6]." 7: ".$_[7];
-#	weechat::print("", "\t".$string);
-
-	$cb_datap = $_[0];
-	$cb_bufferp = $_[1];
-	$cb_date = $_[2];
-	$cb_tags = $_[3];
-	$cb_disp = $_[4];
-	$cb_high = $_[5];
-	$cb_prefix = $_[6];
-	$cb_msg = $_[7];
-
-	# Only work on highlighted messages or private message when enabled
-	if ($cb_high == "1" || (weechat::config_get_plugin("merge_private") eq "on" && $cb_tags =~ /notify_private/))
-	{
-		# Pre bug #29618 (0.3.3) away detect
-		if (weechat::info_get("version_number", "") <= 197120)
-		{
-			$away = '';
-			# Get infolist for this server
-			$infolist = weechat::infolist_get("irc_server", "", weechat::buffer_get_string($cb_bufferp, "localvar_server"));
-			while (weechat::infolist_next($infolist))
-			{
-				# Get away message is is_away is on
-				$away = weechat::infolist_string($infolist, "away_message") if (weechat::infolist_integer($infolist, "is_away"));
-			}
-			weechat::infolist_free($infolist);
-		}
-		# Post bug #29618 fix
-		else
-		{
-			$away = weechat::buffer_get_string($cb_bufferp, "localvar_away");
-		}
-		if (weechat::config_get_plugin("away_only") ne "on" || ($away ne ""))
-		{
-			# Check buffer name is an IRC channel
-			$bufname = weechat::buffer_get_string($cb_bufferp, 'name');
-			if ($bufname =~ /(.*)\.([#&\+!])(.*)/)
-			{
-				# Are we running on this channel
-				if (weechat::config_get_plugin($bufname) ne "off" && $cb_disp eq "1")
-				{
-					# Format nick
-					# Line isn't action or topic notify
-					if (!($cb_tags =~ /irc_action/) && !($cb_tags =~ /irc_topic/))
-					{
-						# Strip nick colour
-						$uncolnick = weechat::string_remove_color($cb_prefix, "");
-						# Format nick
-						$nick = " ".weechat::config_get_plugin("nick_prefix").weechat::color("chat_highlight").$uncolnick.weechat::color("reset").weechat::config_get_plugin("nick_suffix");
-					}
-					# Topic line
-					elsif ($cb_tags =~ /irc_topic/)
-					{
-						$nick = " ".$cb_prefix.weechat::color("reset");
-					}
-					# Action line
-					else
-					{
-						$uncolnick = weechat::string_remove_color($cb_prefix, "");
-						$nick = weechat::color("chat_highlight").$uncolnick.weechat::color("reset");
-					}
-					# Send to output
-					highmon_print ($cb_msg, $cb_bufferp, $nick, $cb_date, $cb_tags);
-				}
-			}
-			# Or is private message
-			elsif (weechat::config_get_plugin("merge_private") eq "on" && $cb_tags =~ /notify_private/)
-			{
-				# Strip nick colour
-				$uncolnick = weechat::buffer_get_string($cb_bufferp, 'short_name');
-				# Format nick
-				$nick = " ".weechat::config_get_plugin("nick_prefix").weechat::color("chat_highlight").$uncolnick.weechat::color("reset").weechat::config_get_plugin("nick_suffix");
-				#Send to output
-				highmon_print ($cb_msg, $cb_bufferp, $nick, $cb_date, $cb_tags);
-			}
-		}
-	}
-	return weechat::WEECHAT_RC_OK;
-}
-
-# Output formatter and printer takes (msg bufpointer nick)
-sub highmon_print
-{
-	$cb_msg = $_[0];
-	my $cb_bufferp = $_[1] if ($_[1]);
-	my $nick = $_[2] if ($_[2]);
-	my $cb_date = $_[3] if ($_[3]);
-	my $cb_tags = $_[4] if ($_[4]);
-
-	#Normal channel message
-	if ($cb_bufferp && $nick)
-	{
-		# Format buffer name
-		$bufname = format_buffer_name($cb_bufferp);
-
-		# If alignment is #channel | nick msg
-		if (weechat::config_get_plugin("alignment") eq "channel")
-		{
-			$nick =~ s/\s(.*)/$1/;
-			# Build string
-			$outstr = $bufname."\t".$nick." ".$cb_msg;
-		}
-		# or if it is channel number | nick msg
-		elsif (weechat::config_get_plugin("alignment") eq "schannel")
-		{
-			$nick =~ s/\s(.*)/$1/;
-			# Use channel number instead
-			$bufname = weechat::color("chat_prefix_buffer").weechat::buffer_get_integer($cb_bufferp, 'number').weechat::color("reset");
-			# Build string
-			$outstr = $bufname."\t".$nick." ".$cb_msg;
-		}
-		# or if it is number:#channel | nick msg
-		elsif (weechat::config_get_plugin("alignment") eq "nchannel")
-		{
-			$nick =~ s/\s(.*)/$1/;
-			# Place channel number in front of formatted name
-			$bufname = weechat::color("chat_prefix_buffer").weechat::buffer_get_integer($cb_bufferp, 'number').":".weechat::color("reset").$bufname;
-			# Build string
-			$outstr = $bufname."\t".$nick." ".$cb_msg;
-		}
-		# or if it is #channel nick | msg
-		elsif (weechat::config_get_plugin("alignment") eq "channel,nick")
-		{
-			# Build string
-			$outstr = $bufname.":".$nick."\t".$cb_msg;
-		}
-		# or if it is channel number nick | msg
-		elsif (weechat::config_get_plugin("alignment") eq "schannel,nick")
-		{
-			# Use channel number instead
-			$bufname = weechat::color("chat_prefix_buffer").weechat::buffer_get_integer($cb_bufferp, 'number').weechat::color("reset");
-			# Build string
-			$outstr = $bufname.":".$nick."\t".$cb_msg;
-		}
-		# or if it is number:#channel nick | msg
-		elsif (weechat::config_get_plugin("alignment") eq "nchannel,nick")
-		{
-			# Place channel number in front of formatted name
-			$bufname = weechat::color("chat_prefix_buffer").weechat::buffer_get_integer($cb_bufferp, 'number').":".weechat::color("reset").$bufname;
-			# Build string
-			$outstr = $bufname.":".$nick."\t".$cb_msg;
-		}
-		# or finally | #channel nick msg
-		else
-		{
-			# Build string
-			$outstr = "\t".$bufname.":".$nick." ".$cb_msg;
-		}
-	}
-	# highmon channel toggle message
-	elsif ($cb_bufferp && !$nick)
-	{
-		# Format buffer name
-		$bufname = format_buffer_name($cb_bufferp);
-
-		# If alignment is #channel * | *
-		if (weechat::config_get_plugin("alignment") =~ /channel/)
-		{
-			# If it's actually channel number * | *
-			if (weechat::config_get_plugin("alignment") =~ /schannel/)
-			{
-				# Use channel number instead
-				$bufname = weechat::color("chat_prefix_buffer").weechat::buffer_get_integer($cb_bufferp, 'number').weechat::color("reset");
-			}
-			# Or if it's actually number:#channel * | *
-			if (weechat::config_get_plugin("alignment") =~ /nchannel/)
-			{
-				# Place channel number in front of formatted name
-			$bufname = weechat::color("chat_prefix_buffer").weechat::buffer_get_integer($cb_bufferp, 'number').":".weechat::color("reset").$bufname;
-			}
-			$outstr = $bufname."\t".$cb_msg;
-		}
-		# or if alignment is | *
-		else
-		{
-			$outstr = $bufname.": ".$cb_msg;
-		}
-	}
-	# highmon dynmon
-	elsif (!$cb_bufferp && !$nick)
-	{
-		$outstr = "\t".$cb_msg;
-	}
-
-	# Send string to buffer
-	if (weechat::config_get_plugin("output") eq "buffer")
-	{
-		# Search for and confirm buffer
-		$highmon_buffer = weechat::buffer_search("perl", "highmon");
-		# Print
-		if ($cb_date)
-		{
-			weechat::print_date_tags($highmon_buffer, $cb_date, $cb_tags, $outstr);
-		}
-		else
-		{
-			weechat::print($highmon_buffer, $outstr);
-		}
-	}
-	elsif (weechat::config_get_plugin("output") eq "bar")
-	{
-		# Add time string
-		use POSIX qw(strftime);
-		if ($cb_date)
-		{
-			$time = strftime(weechat::config_string(weechat::config_get("weechat.look.buffer_time_format")), localtime($cb_date));
-		}
-		else
-		{
-			$time = strftime(weechat::config_string(weechat::config_get("weechat.look.buffer_time_format")), localtime);
-		}
-		# Colourise
-		if ($time =~ /\$\{(?:color:)?[\w,]+\}/) # Coloured string
-		{
-			while ($time =~ /\$\{(?:color:)?([\w,]+)\}/)
-			{
-				$color = weechat::color($1);
-				$time =~ s/\$\{(?:color:)?[\w,]+\}/$color/;
-			}
-			$time .= weechat::color("reset");
-		}
-		else # Default string
-		{
-			$colour = weechat::color(weechat::config_string(weechat::config_get("weechat.color.chat_time_delimiters")));
-			$reset = weechat::color("reset");
-			$time =~ s/(\d*)(.)(\d*)/$1$colour$2$reset$3/g;
-		}
-		# Push updates to bar lists
-		push (@bar_lines_time, $time);
-
-		# Change tab char
-		$delim = " ".weechat::color(weechat::config_string(weechat::config_get("weechat.color.chat_delimiters"))).weechat::config_string(weechat::config_get("weechat.look.prefix_suffix")).weechat::color("reset")." ";
-		$outstr =~ s/\t/$delim/;
-
-		push (@bar_lines, $outstr);
-		# Trigger update
-		weechat::bar_item_update("highmon");
-
-		if (weechat::config_get_plugin("bar_scrolldown") eq "on")
-		{
-			weechat::command("", "/bar scroll highmon * ye")
-		}
-	}
-}
-
-# Start the output display
-sub highmon_start
-{
-	if (weechat::config_get_plugin("output") eq "buffer")
-	{
-		highmon_buffer_open();
-	}
-	elsif (weechat::config_get_plugin("output") eq "bar")
-	{
-		highmon_bar_open();
-	}
-}
-
-# Takes two optional args (channel server), toggles monitoring on/off
-sub highmon_toggle
-{
-	$data = $_[0];
-	$buffer = $_[1];
-	$args = $_[2];
-
-	# Check if we've been told what channel to act on
-	if ($args ne "")
-	{
-		# Split argument up
-		@arg_array = split(/ /,$args);
-		# Check if a server was given
-		if ($arg_array[1])
-		{
-			# Find matching
-			$bufp = weechat::buffer_search("irc", $arg_array[1].".".$arg_array[0]);
-		}
-		else
-		{
-			$found_chans = 0;
-			# Loop through defined servers
-			$infolist = weechat::infolist_get("buffer", "", "");
-			while (weechat::infolist_next($infolist))
-			{
-				# Only interesting in IRC buffers
-				if (weechat::infolist_string($infolist, "plugin_name") eq "irc")
-				{
-					# Find buffers that maych
-					$sname = weechat::infolist_string($infolist, "short_name");
-					if ($sname eq $arg_array[0])
-					{
-						$found_chans++;
-						$bufp = weechat::infolist_pointer($infolist, "pointer");
-					}
-				}
-			}
-			weechat::infolist_free($infolist);
-			# If the infolist found more than one channel, halt as we need to know which one
-			if ($found_chans > 1)
-			{
-				weechat::print("", "Channel name is not unique, please define server");
-				return weechat::WEECHAT_RC_OK;
-			}
-		}
-		# Something didn't return right
-		if ($bufp eq "")
-		{
-			weechat::print("", "Could not find buffer");
-			return weechat::WEECHAT_RC_OK;
-		}
-	}
-	else
-	{
-		# Get pointer from where we are
-		$bufp = weechat::current_buffer();
-	}
-	# Get buffer name
-	$bufname = weechat::buffer_get_string($bufp, 'name');
-	# Test if buffer is an IRC channel
-	if ($bufname =~ /(.*)\.([#&\+!])(.*)/)
-	{
-		if (weechat::config_get_plugin($bufname) eq "off")
-		{
-			# If currently off, set on
-			weechat::config_set_plugin($bufname, "on");
-
-			# Send to output formatter
-			highmon_print("Highlight Monitoring Enabled", $bufp);
-			return weechat::WEECHAT_RC_OK;
-		}
-		elsif (weechat::config_get_plugin($bufname) eq "on" || weechat::config_get_plugin($bufname) eq "")
-		{
-			# If currently on, set off
-			weechat::config_set_plugin($bufname, "off");
-
-			# Send to output formatter
-			highmon_print("Highlight Monitoring Disabled", $bufp);
-			return weechat::WEECHAT_RC_OK;
-		}
-	}
-}
-
-# Takes a buffer pointer and returns a formatted name
-sub format_buffer_name
-{
-	$cb_bufferp = $_[0];
-	$bufname = weechat::buffer_get_string($cb_bufferp, 'name');
-
-	# Set colour from buffer name
-	if (weechat::config_get_plugin("color_buf") eq "on")
-	{
-		# Determine what colour to use
-		$color = weechat::info_get("irc_nick_color", $bufname);
-		if (!$color)
-		{
-			$color = 0;
-			@char_array = split(//,$bufname);
-			foreach $char (@char_array)
-			{
-				$color += ord($char);
-			}
-			$color %= 10;
-			$color = sprintf "weechat.color.chat_nick_color%02d", $color+1;
-			$color = weechat::config_get($color);
-			$color = weechat::config_string($color);
-			$color = weechat::color($color);
-		}
-
-		# Private message just show network
-		if (weechat::config_get_plugin("merge_private") eq "on" && weechat::buffer_get_string($cb_bufferp, "localvar_type") eq "private")
-		{
-			$bufname = weechat::buffer_get_string($cb_bufferp, "localvar_server");
-		}
-		# Format name to short or 'nicename'
-		elsif (weechat::config_get_plugin("short_names") eq "on")
-		{
-			$bufname = weechat::buffer_get_string($cb_bufferp, 'short_name');
-		}
-		else
-		{
-			$bufname =~ s/(.*)\.([#&\+!])(.*)/$1$2$3/;
-		}
-
-		# Build a coloured string
-		$bufname = $color.$bufname.weechat::color("reset");
-	}
-	# User set colour name
-	elsif (weechat::config_get_plugin("color_buf") ne "off")
-	{
-		# Private message just show network
-		if (weechat::config_get_plugin("merge_private") eq "on" && weechat::buffer_get_string($cb_bufferp, "localvar_type") eq "private")
-		{
-			$bufname = weechat::buffer_get_string($cb_bufferp, "localvar_server");
-		}
-		# Format name to short or 'nicename'
-		elsif (weechat::config_get_plugin("short_names") eq "on")
-		{
-			$bufname = weechat::buffer_get_string($cb_bufferp, 'short_name');
-		}
-		else
-		{
-			$bufname =~ s/(.*)\.([#&\+!])(.*)/$1$2$3/;
-		}
-
-		$color = weechat::config_get_plugin("color_buf");
-		$bufname = weechat::color($color).$bufname.weechat::color("reset");
-	}
-	# Stick with default colour
-	else
-	{
-		# Private message just show network
-		if (weechat::config_get_plugin("merge_private") eq "on" && weechat::buffer_get_string($cb_bufferp, "localvar_type") eq "private")
-		{
-			$bufname = weechat::buffer_get_string($cb_bufferp, "localvar_server");
-		}
-		# Format name to short or 'nicename'
-		elsif (weechat::config_get_plugin("short_names") eq "on")
-		{
-			$bufname = weechat::buffer_get_string($cb_bufferp, 'short_name');
-		}
-		else
-		{
-			$bufname =~ s/(.*)\.([#&\+!])(.*)/$1$2$3/;
-		}
-	}
-
-	return $bufname;
-}
-
-# Check result of register, and attempt to behave in a sane manner
-if (!weechat::register("highmon", "KenjiE20", "2.5", "GPL3", "Highlight Monitor", "", ""))
-{
-	# Double load
-	weechat::print ("", "\tHighmon is already loaded");
-	return weechat::WEECHAT_RC_OK;
-}
-else
-{
-	# Start everything
-	highmon_hook();
-	highmon_config_init();
-	highmon_start();
-}
diff --git a/.weechat/perl/iset.pl b/.weechat/perl/iset.pl
deleted file mode 100644
index 163dfb5e..00000000
--- a/.weechat/perl/iset.pl
+++ /dev/null
@@ -1,1624 +0,0 @@
-#
-# Copyright (C) 2008-2014 Sebastien Helleu <flashcode@flashtux.org>
-# Copyright (C) 2010-2015 Nils Görs <weechatter@arcor.de>
-#
-# 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 <http://www.gnu.org/licenses/>.
-#
-# Set WeeChat and plugins options interactively.
-#
-# History:
-#
-# 2016-07-08, nils_2 <weechatter@arcor.de>
-#     version 4.2: add diff function
-# 2016-02-06, Sebastien Helleu <flashcode@flashtux.org>:
-#     version 4.1: remove debug print
-# 2015-12-24, Sebastien Helleu <flashcode@flashtux.org>:
-#     version 4.0: add support of parent options (inherited values in irc servers)
-#                  with WeeChat >= 1.4
-# 2015-05-16, Sebastien Helleu <flashcode@flashtux.org>:
-#     version 3.9: fix cursor position when editing an option with WeeChat >= 1.2
-# 2015-05-02, arza <arza@arza.us>:
-#     version 3.8: don't append "null" to /set when setting an undefined setting
-# 2015-05-01, nils_2 <weechatter@arcor.de>:
-#     version 3.7: fix two perl warnings (reported by t3chguy)
-# 2014-09-30, arza <arza@arza.us>:
-#     version 3.6: fix current line counter when options aren't found
-# 2014-06-03, nils_2 <weechatter@arcor.de>:
-#     version 3.5: add new option "use_mute"
-# 2014-01-30, stfn <stfnmd@gmail.com>:
-#     version 3.4: add new options "color_value_diff" and "color_value_diff_selected"
-# 2014-01-16, luz <ne.tetewi@gmail.com>:
-#     version 3.3: fix bug with column alignment in iset buffer when option
-#                  name contains unicode characters
-# 2013-08-03, Sebastien Helleu <flashcode@flashtux.org>:
-#     version 3.2: allow "q" as input in iset buffer to close it
-# 2013-07-14, Sebastien Helleu <flashcode@flashtux.org>:
-#     version 3.1: remove unneeded calls to iset_refresh() in mouse callback
-#                  (faster mouse actions when lot of options are displayed),
-#                  fix bug when clicking on a line after the last option displayed
-# 2013-04-30, arza <arza@arza.us>:
-#     version 3.0: simpler title, fix refresh on unset
-# 2012-12-16, nils_2 <weechatter@arcor.de>:
-#     version 2.9: fix focus window with iset buffer on mouse click
-# 2012-08-25, nils_2 <weechatter@arcor.de>:
-#     version 2.8: most important key and mouse bindings for iset buffer added to title-bar (idea The-Compiler)
-# 2012-07-31, nils_2 <weechatter@arcor.de>:
-#     version 2.7: add combined option and value search (see /help iset)
-#                : add exact value search (see /help iset)
-#                : fix problem with metacharacter in value search
-#                : fix use of uninitialized value for unset option and reset value of option
-# 2012-07-25, nils_2 <weechatter@arcor.de>:
-#     version 2.6: switch to iset buffer (if existing) when command /iset is called with arguments
-# 2012-03-17, Sebastien Helleu <flashcode@flashtux.org>:
-#     version 2.5: fix check of sections when creating config file
-# 2012-03-09, Sebastien Helleu <flashcode@flashtux.org>:
-#     version 2.4: fix reload of config file
-# 2012-02-02, nils_2 <weechatter@arcor.de>:
-#     version 2.3: fixed: refresh problem with new search results and cursor was outside window.
-#                : add: new option "current_line" in title bar
-#     version 2.2: fixed: refresh error when toggling plugins description
-# 2011-11-05, nils_2 <weechatter@arcor.de>:
-#     version 2.1: use own config file (iset.conf), fix own help color (used immediately)
-# 2011-10-16, nils_2 <weechatter@arcor.de>:
-#     version 2.0: add support for left-mouse-button and more sensitive mouse gesture (for integer/color options)
-#                  add help text for mouse support
-# 2011-09-20, Sebastien Helleu <flashcode@flashtux.org>:
-#     version 1.9: add mouse support, fix iset buffer, fix errors on first load under FreeBSD
-# 2011-07-21, nils_2 <weechatter@arcor.de>:
-#     version 1.8: added: option "show_plugin_description" (alt+p)
-#                  fixed: typos in /help iset (lower case for alt+'x' keys)
-# 2011-05-29, nils_2 <weechatter@arcor.de>:
-#     version 1.7: added: version check for future needs
-#                  added: new option (scroll_horiz) and usage of scroll_horiz function (weechat >= 0.3.6 required)
-#                  fixed: help_bar did not pop up immediately using key-shortcut
-# 2011-02-19, nils_2 <weechatter@arcor.de>:
-#     version 1.6: added: display of all possible values in help bar (show_help_extra_info)
-#                  fixed: external user options never loaded when starting iset first time
-# 2011-02-13, Sebastien Helleu <flashcode@flashtux.org>:
-#     version 1.5: use new help format for command arguments
-# 2011-02-03, nils_2 <weechatter@arcor.de>:
-#     version 1.4: fixed: restore value filter after /upgrade using buffer local variable.
-# 2011-01-14, nils_2 <weechatter@arcor.de>:
-#     version 1.3: added function to search for values (option value_search_char).
-#                  code optimization.
-# 2010-12-26, Sebastien Helleu <flashcode@flashtux.org>:
-#     version 1.2: improve speed of /upgrade when iset buffer is open,
-#                  restore filter used after /upgrade using buffer local variable,
-#                  use /iset filter argument if buffer is open.
-# 2010-11-21, drubin <drubin+weechat@smartcube.co.za>:
-#     version 1.1.1: fix bugs with cursor position
-# 2010-11-20, nils_2 <weechatter@arcor.de>:
-#     version 1.1: cursor position set to value
-# 2010-08-03, Sebastien Helleu <flashcode@flashtux.org>:
-#     version 1.0: move misplaced call to infolist_free()
-# 2010-02-02, rettub <rettub@gmx.net>:
-#     version 0.9: turn all the help stuff off if option 'show_help_bar' is 'off',
-#                  new key binding <alt>-<v> to toggle help_bar and help stuff on/off
-# 2010-01-30, nils_2 <weechatter@arcor.de>:
-#     version 0.8: fix error when option does not exist
-# 2010-01-24, Sebastien Helleu <flashcode@flashtux.org>:
-#     version 0.7: display iset bar only on iset buffer
-# 2010-01-22, nils_2 <weechatter@arcor.de> and drubin:
-#     version 0.6: add description in a bar, fix singular/plural bug in title bar,
-#                  fix selected line when switching buffer
-# 2009-06-21, Sebastien Helleu <flashcode@flashtux.org>:
-#     version 0.5: fix bug with iset buffer after /upgrade
-# 2009-05-02, Sebastien Helleu <flashcode@flashtux.org>:
-#     version 0.4: sync with last API changes
-# 2009-01-04, Sebastien Helleu <flashcode@flashtux.org>:
-#     version 0.3: open iset buffer when /iset command is executed
-# 2009-01-04, Sebastien Helleu <flashcode@flashtux.org>:
-#     version 0.2: use null values for options, add colors, fix refresh bugs,
-#                  use new keys to reset/unset options, sort options by name,
-#                  display number of options in buffer's title
-# 2008-11-05, Sebastien Helleu <flashcode@flashtux.org>:
-#     version 0.1: first official version
-# 2008-04-19, Sebastien Helleu <flashcode@flashtux.org>:
-#     script creation
-
-use strict;
-
-my $PRGNAME = "iset";
-my $VERSION = "4.2";
-my $DESCR   = "Interactive Set for configuration options";
-my $AUTHOR  = "Sebastien Helleu <flashcode\@flashtux.org>";
-my $LICENSE = "GPL3";
-my $LANG    = "perl";
-my $ISET_CONFIG_FILE_NAME = "iset";
-
-my $iset_config_file;
-my $iset_buffer = "";
-my $wee_version_number = 0;
-my @iset_focus = ();
-my @options_names = ();
-my @options_parent_names = ();
-my @options_types = ();
-my @options_values = ();
-my @options_default_values = ();
-my @options_parent_values = ();
-my @options_is_null = ();
-my $option_max_length = 0;
-my $current_line = 0;
-my $filter = "*";
-my $description = "";
-my $options_name_copy = "";
-my $iset_filter_title = "";
-# search modes: 0 = index() on value, 1 = grep() on value, 2 = grep() on option, 3 = grep on option & value, 4 = diff all, 5 = diff parts
-my $search_mode = 2;
-my $search_value = "";
-my $help_text_keys = "alt + space: toggle, +/-: increase/decrease, enter: change, ir: reset, iu: unset, v: toggle help bar";
-my $help_text_mouse = "Mouse: left: select, right: toggle/set, right + drag left/right: increase/decrease";
-my %options_iset;
-
-my %mouse_keys = ("\@chat(perl.$PRGNAME):button1" => "hsignal:iset_mouse",
-                  "\@chat(perl.$PRGNAME):button2*" => "hsignal:iset_mouse",
-                  "\@chat(perl.$PRGNAME):wheelup" => "/repeat 5 /iset **up",
-                  "\@chat(perl.$PRGNAME):wheeldown" => "/repeat 5 /iset **down");
-
-
-sub iset_title
-{
-    if ($iset_buffer ne "")
-    {
-        my $current_line_counter = "";
-        if (weechat::config_boolean($options_iset{"show_current_line"}) == 1)
-        {
-            if (@options_names eq 0)
-            {
-                $current_line_counter = "0/";
-            }
-            else
-            {
-                $current_line_counter = ($current_line + 1) . "/";
-            }
-        }
-        my $show_filter = "";
-        if ($search_mode eq 0)
-        {
-            $iset_filter_title = "(value) ";
-            $show_filter = $search_value;
-            if ( substr($show_filter,0,1) eq weechat::config_string($options_iset{"value_search_char"}) )
-            {
-                $show_filter = substr($show_filter,1,length($show_filter));
-            }
-        }
-        elsif ($search_mode eq 1)
-        {
-            $iset_filter_title = "(value) ";
-            $show_filter = "*".$search_value."*";
-        }
-        elsif ($search_mode eq 2)
-        {
-            $iset_filter_title = "";
-            $filter = "*" if ($filter eq "");
-            $show_filter = $filter;
-        }
-        elsif ($search_mode == 4 or $search_mode == 5)
-        {
-            $iset_filter_title = "diff: ";
-            $show_filter = "all";
-            $show_filter = $search_value if $search_mode == 5;
-        }
-        elsif ($search_mode eq 3)
-        {
-            $iset_filter_title = "(option) ";
-            $show_filter = $filter
-                            .weechat::color("default")
-                            ." / (value) "
-                            .weechat::color("yellow")
-                            ."*".$search_value."*";
-        }
-        weechat::buffer_set($iset_buffer, "title",
-                             $iset_filter_title
-                            .weechat::color("yellow")
-                            .$show_filter
-                            .weechat::color("default")." | "
-                            .$current_line_counter
-                            .@options_names
-                            ." | "
-                            .$help_text_keys
-                            ." | "
-                            .$help_text_mouse);
-    }
-}
-
-sub iset_create_filter
-{
-    $filter = $_[0];
-    if ( $search_mode == 3 )
-    {
-        my @cmd_array = split(/ /,$filter);
-        my $array_count = @cmd_array;
-        $filter = $cmd_array[0];
-        $filter = $cmd_array[0] . " " . $cmd_array[1] if ( $array_count >2 );
-    }
-    $filter = "$1.*" if ($filter =~ /f (.*)/); # search file
-    $filter = "*.$1.*" if ($filter =~ /s (.*)/); # search section
-    if ((substr($filter, 0, 1) ne "*") && (substr($filter, -1, 1) ne "*"))
-    {
-        $filter = "*".$filter."*";
-    }
-    if ($iset_buffer ne "")
-    {
-        weechat::buffer_set($iset_buffer, "localvar_set_iset_filter", $filter);
-    }
-}
-
-sub iset_buffer_input
-{
-    my ($data, $buffer, $string) = ($_[0], $_[1], $_[2]);
-
-    # string begins with space?
-    return weechat::WEECHAT_RC_OK if (substr($string, 0, 1 ) eq " ");
-
-    if ($string eq "q")
-    {
-        weechat::buffer_close($buffer);
-        return weechat::WEECHAT_RC_OK;
-    }
-    $search_value = "";
-    my @cmd_array = split(/ /,$string);
-    my $array_count = @cmd_array;
-    my $string2 = substr($string, 0, 1);
-    if ($string2 eq weechat::config_string($options_iset{"value_search_char"})
-    or (defined $cmd_array[0] and $cmd_array[0] eq weechat::config_string($options_iset{"value_search_char"}).weechat::config_string($options_iset{"value_search_char"})) )
-    {
-        $search_mode = 1;
-        $search_value = substr($string, 1);
-        iset_get_values($search_value);
-        if ($iset_buffer ne "")
-        {
-            weechat::buffer_set($iset_buffer, "localvar_set_iset_search_value", $search_value);
-        }
-    }
-    # show all diff values
-    elsif ($string eq "d")
-    {
-        $search_mode = 4;
-#        iset_title();
-        iset_create_filter("*");
-        iset_get_options("*");
-    }
-    elsif ( $array_count >= 2 and $cmd_array[0] eq "d")
-    {
-        $search_mode = 5;
-        $search_value = substr($cmd_array[1], 0);  # cut value_search_char
-        $search_value = substr($cmd_array[2], 0) if ( $array_count > 2);  # cut value_search_char
-        iset_create_filter($search_value);
-        iset_get_options($search_value);
-
-    }
-    else
-    {
-        $search_mode = 2;
-        if ( $array_count >= 2 and $cmd_array[0] ne "f" or $cmd_array[0] ne "s" )
-        {
-            if ( defined $cmd_array[1] and substr($cmd_array[1], 0, 1) eq weechat::config_string($options_iset{"value_search_char"})
-            or defined $cmd_array[2] and substr($cmd_array[2], 0, 1) eq weechat::config_string($options_iset{"value_search_char"}) )
-            {
-                $search_mode = 3;
-                $search_value = substr($cmd_array[1], 1);  # cut value_search_char
-                $search_value = substr($cmd_array[2], 1) if ( $array_count > 2);  # cut value_search_char
-            }
-        }
-        if ( $search_mode == 3)
-        {
-            iset_create_filter($string);
-            iset_get_options($search_value);
-        }
-        else
-        {
-            iset_create_filter($string);
-            iset_get_options("");
-        }
-    }
-    weechat::buffer_set($iset_buffer, "localvar_set_iset_search_mode", $search_mode);
-    weechat::buffer_clear($buffer);
-    $current_line = 0;
-    iset_refresh();
-    return weechat::WEECHAT_RC_OK;
-}
-
-sub iset_buffer_close
-{
-    $iset_buffer = "";
-
-    return weechat::WEECHAT_RC_OK;
-}
-
-sub iset_init
-{
-    $current_line = 0;
-    $iset_buffer = weechat::buffer_search($LANG, $PRGNAME);
-    if ($iset_buffer eq "")
-    {
-        $iset_buffer = weechat::buffer_new($PRGNAME, "iset_buffer_input", "", "iset_buffer_close", "");
-    }
-    else
-    {
-        my $new_filter = weechat::buffer_get_string($iset_buffer, "localvar_iset_filter");
-        $search_mode = weechat::buffer_get_string($iset_buffer, "localvar_iset_search_mode");
-        $search_value = weechat::buffer_get_string($iset_buffer, "localvar_iset_search_value");
-        $filter = $new_filter if ($new_filter ne "");
-    }
-    if ($iset_buffer ne "")
-    {
-        weechat::buffer_set($iset_buffer, "type", "free");
-        iset_title();
-        weechat::buffer_set($iset_buffer, "key_bind_ctrl-L",        "/iset **refresh");
-        weechat::buffer_set($iset_buffer, "key_bind_meta2-A",       "/iset **up");
-        weechat::buffer_set($iset_buffer, "key_bind_meta2-B",       "/iset **down");
-        weechat::buffer_set($iset_buffer, "key_bind_meta2-23~",     "/iset **left");
-        weechat::buffer_set($iset_buffer, "key_bind_meta2-24~" ,    "/iset **right");
-        weechat::buffer_set($iset_buffer, "key_bind_meta- ",        "/iset **toggle");
-        weechat::buffer_set($iset_buffer, "key_bind_meta-+",        "/iset **incr");
-        weechat::buffer_set($iset_buffer, "key_bind_meta--",        "/iset **decr");
-        weechat::buffer_set($iset_buffer, "key_bind_meta-imeta-r",  "/iset **reset");
-        weechat::buffer_set($iset_buffer, "key_bind_meta-imeta-u",  "/iset **unset");
-        weechat::buffer_set($iset_buffer, "key_bind_meta-ctrl-J",   "/iset **set");
-        weechat::buffer_set($iset_buffer, "key_bind_meta-ctrl-M",   "/iset **set");
-        weechat::buffer_set($iset_buffer, "key_bind_meta-meta2-1~", "/iset **scroll_top");
-        weechat::buffer_set($iset_buffer, "key_bind_meta-meta2-4~", "/iset **scroll_bottom");
-        weechat::buffer_set($iset_buffer, "key_bind_meta-v",        "/iset **toggle_help");
-        weechat::buffer_set($iset_buffer, "key_bind_meta-p",        "/iset **toggle_show_plugin_desc");
-        weechat::buffer_set($iset_buffer, "localvar_set_iset_filter", $filter);
-        weechat::buffer_set($iset_buffer, "localvar_set_iset_search_mode", $search_mode);
-        weechat::buffer_set($iset_buffer, "localvar_set_iset_search_value", $search_value);
-    }
-}
-
-sub iset_get_options
-{
-    my $var_value = $_[0];
-    $var_value = "" if (not defined $var_value);
-    $var_value = lc($var_value);
-    $search_value = $var_value;
-    @iset_focus = ();
-    @options_names = ();
-    @options_parent_names = ();
-    @options_types = ();
-    @options_values = ();
-    @options_default_values = ();
-    @options_parent_values = ();
-    @options_is_null = ();
-    $option_max_length = 0;
-    my %options_internal = ();
-    my $i = 0;
-    my $key;
-    my $iset_struct;
-    my %iset_struct;
-
-    weechat::buffer_set($iset_buffer, "localvar_set_iset_search_value", $var_value) if ($search_mode == 3);
-
-    my $infolist = weechat::infolist_get("option", "", $filter);
-    while (weechat::infolist_next($infolist))
-    {
-        $key = sprintf("%08d", $i);
-        my $name = weechat::infolist_string($infolist, "full_name");
-        my $parent_name = weechat::infolist_string($infolist, "parent_name");
-        next if (weechat::config_boolean($options_iset{"show_plugin_description"}) == 0 and index ($name, "plugins.desc.") != -1);
-        my $type = weechat::infolist_string($infolist, "type");
-        my $value = weechat::infolist_string($infolist, "value");
-        my $default_value = weechat::infolist_string($infolist, "default_value");
-        my $parent_value;
-        if ($parent_name && (($wee_version_number < 0x00040300) || (weechat::infolist_search_var($infolist, "parent_value"))))
-        {
-            $parent_value = weechat::infolist_string($infolist, "parent_value");
-        }
-        my $is_null = weechat::infolist_integer($infolist, "value_is_null");
-
-        if ($search_mode == 3)
-        {
-            my $value = weechat::infolist_string($infolist, "value");
-            if ( grep /\Q$var_value/,lc($value) )
-            {
-                $options_internal{$name}{"parent_name"} = $parent_name;
-                $options_internal{$name}{"type"} = $type;
-                $options_internal{$name}{"value"} = $value;
-                $options_internal{$name}{"default_value"} = $default_value;
-                $options_internal{$name}{"parent_value"} = $parent_value;
-                $options_internal{$name}{"is_null"} = $is_null;
-                $option_max_length = length($name) if (length($name) > $option_max_length);
-                $iset_struct{$key} = $options_internal{$name};
-                push(@iset_focus, $iset_struct{$key});
-            }
-        }
-        # search for diff?
-        elsif ( $search_mode == 4 or $search_mode == 5)
-        {
-            if ($value ne $default_value )
-            {
-                $options_internal{$name}{"parent_name"} = $parent_name;
-                $options_internal{$name}{"type"} = $type;
-                $options_internal{$name}{"value"} = $value;
-                $options_internal{$name}{"default_value"} = $default_value;
-                $options_internal{$name}{"parent_value"} = $parent_value;
-                $options_internal{$name}{"is_null"} = $is_null;
-                $option_max_length = length($name) if (length($name) > $option_max_length);
-                $iset_struct{$key} = $options_internal{$name};
-                push(@iset_focus, $iset_struct{$key});
-            }
-        }
-        else
-        {
-            $options_internal{$name}{"parent_name"} = $parent_name;
-            $options_internal{$name}{"type"} = $type;
-            $options_internal{$name}{"value"} = $value;
-            $options_internal{$name}{"default_value"} = $default_value;
-            $options_internal{$name}{"parent_value"} = $parent_value;
-            $options_internal{$name}{"is_null"} = $is_null;
-            $option_max_length = length($name) if (length($name) > $option_max_length);
-            $iset_struct{$key} = $options_internal{$name};
-            push(@iset_focus, $iset_struct{$key});
-        }
-        $i++;
-    }
-    weechat::infolist_free($infolist);
-
-    foreach my $name (sort keys %options_internal)
-    {
-        push(@options_names, $name);
-        push(@options_parent_names, $options_internal{$name}{"parent_name"});
-        push(@options_types, $options_internal{$name}{"type"});
-        push(@options_values, $options_internal{$name}{"value"});
-        push(@options_default_values, $options_internal{$name}{"default_value"});
-        push(@options_parent_values, $options_internal{$name}{"parent_value"});
-        push(@options_is_null, $options_internal{$name}{"is_null"});
-    }
-}
-
-sub iset_get_values
-{
-    my $var_value = $_[0];
-    $var_value = lc($var_value);
-    if (substr($var_value,0,1) eq weechat::config_string($options_iset{"value_search_char"}) and $var_value ne weechat::config_string($options_iset{"value_search_char"}))
-    {
-        $var_value = substr($var_value,1,length($var_value));
-        $search_mode = 0;
-    }
-    iset_search_values($var_value,$search_mode);
-    weechat::buffer_set($iset_buffer, "localvar_set_iset_search_mode", $search_mode);
-    weechat::buffer_set($iset_buffer, "localvar_set_iset_search_value", $var_value);
-    $search_value = $var_value;
-}
-sub iset_search_values
-{
-    my ($var_value,$search_mode) = ($_[0],$_[1]);
-    @options_names = ();
-    @options_parent_names = ();
-    @options_types = ();
-    @options_values = ();
-    @options_default_values = ();
-    @options_parent_values = ();
-    @options_is_null = ();
-    $option_max_length = 0;
-    my %options_internal = ();
-    my $i = 0;
-    my $infolist = weechat::infolist_get("option", "", "*");
-    while (weechat::infolist_next($infolist))
-    {
-        my $name = weechat::infolist_string($infolist, "full_name");
-        my $parent_name = weechat::infolist_string($infolist, "parent_name");
-        next if (weechat::config_boolean($options_iset{"show_plugin_description"}) == 0 and index ($name, "plugins.desc.") != -1);
-        my $type = weechat::infolist_string($infolist, "type");
-        my $is_null = weechat::infolist_integer($infolist, "value_is_null");
-        my $value = weechat::infolist_string($infolist, "value");
-        my $default_value = weechat::infolist_string($infolist, "default_value");
-        my $parent_value;
-        if ($parent_name && (($wee_version_number < 0x00040300) || (weechat::infolist_search_var($infolist, "parent_value"))))
-        {
-            $parent_value = weechat::infolist_string($infolist, "parent_value");
-        }
-        if ($search_mode)
-        {
-            if ( grep /\Q$var_value/,lc($value) )
-            {
-                $options_internal{$name}{"parent_name"} = $parent_name;
-                $options_internal{$name}{"type"} = $type;
-                $options_internal{$name}{"value"} = $value;
-                $options_internal{$name}{"default_value"} = $default_value;
-                $options_internal{$name}{"parent_value"} = $parent_value;
-                $options_internal{$name}{"is_null"} = $is_null;
-                $option_max_length = length($name) if (length($name) > $option_max_length);
-            }
-        }
-        else
-        {
-#            if ($value =~ /\Q$var_value/si)
-            if (lc($value) eq $var_value)
-            {
-                $options_internal{$name}{"parent_name"} = $parent_name;
-                $options_internal{$name}{"type"} = $type;
-                $options_internal{$name}{"value"} = $value;
-                $options_internal{$name}{"default_value"} = $default_value;
-                $options_internal{$name}{"parent_value"} = $parent_value;
-                $options_internal{$name}{"is_null"} = $is_null;
-                $option_max_length = length($name) if (length($name) > $option_max_length);
-            }
-        }
-        $i++;
-    }
-    weechat::infolist_free($infolist);
-    foreach my $name (sort keys %options_internal)
-    {
-        push(@options_names, $name);
-        push(@options_parent_names, $options_internal{$name}{"parent_name"});
-        push(@options_types, $options_internal{$name}{"type"});
-        push(@options_values, $options_internal{$name}{"value"});
-        push(@options_default_values, $options_internal{$name}{"default_value"});
-        push(@options_parent_values, $options_internal{$name}{"parent_value"});
-        push(@options_is_null, $options_internal{$name}{"is_null"});
-    }
-}
-
-sub iset_refresh_line
-{
-    if ($iset_buffer ne "")
-    {
-        my $y = $_[0];
-        if ($y <= $#options_names)
-        {
-            return if (! defined($options_types[$y]));
-            my $format = sprintf("%%s%%s%%s %%s %%-7s %%s %%s%%s%%s");
-            my $padding;
-            if ($wee_version_number >= 0x00040200)
-            {
-                $padding = " " x ($option_max_length - weechat::strlen_screen($options_names[$y]));
-            }
-            else
-            {
-                $padding = " " x ($option_max_length - length($options_names[$y]));
-            }
-            my $around = "";
-            $around = "\"" if ((!$options_is_null[$y]) && ($options_types[$y] eq "string"));
-
-            my $color1 = weechat::color(weechat::config_color($options_iset{"color_option"}));
-            my $color2 = weechat::color(weechat::config_color($options_iset{"color_type"}));
-            my $color3 = "";
-            my $color4 = "";
-            if ($options_is_null[$y])
-            {
-                $color3 = weechat::color(weechat::config_color($options_iset{"color_value_undef"}));
-                $color4 = weechat::color(weechat::config_color($options_iset{"color_value"}));
-            }
-            elsif ($options_values[$y] ne $options_default_values[$y])
-            {
-                $color3 = weechat::color(weechat::config_color($options_iset{"color_value_diff"}));
-            }
-            else
-            {
-                $color3 = weechat::color(weechat::config_color($options_iset{"color_value"}));
-            }
-            if ($y == $current_line)
-            {
-                $color1 = weechat::color(weechat::config_color($options_iset{"color_option_selected"}).",".weechat::config_color($options_iset{"color_bg_selected"}));
-                $color2 = weechat::color(weechat::config_color($options_iset{"color_type_selected"}).",".weechat::config_color($options_iset{"color_bg_selected"}));
-                if ($options_is_null[$y])
-                {
-                    $color3 = weechat::color(weechat::config_color($options_iset{"color_value_undef_selected"}).",".weechat::config_color($options_iset{"color_bg_selected"}));
-                    $color4 = weechat::color(weechat::config_color($options_iset{"color_value_selected"}).",".weechat::config_color($options_iset{"color_bg_selected"}));
-                }
-                elsif ($options_values[$y] ne $options_default_values[$y])
-                {
-                    $color3 = weechat::color(weechat::config_color($options_iset{"color_value_diff_selected"}).",".weechat::config_color($options_iset{"color_bg_selected"}));
-                }
-                else
-                {
-                    $color3 = weechat::color(weechat::config_color($options_iset{"color_value_selected"}).",".weechat::config_color($options_iset{"color_bg_selected"}));
-                }
-            }
-            my $value = $options_values[$y];
-            if ($options_is_null[$y])
-            {
-                $value = "null";
-                if ($options_parent_names[$y])
-                {
-                    if (defined $options_parent_values[$y])
-                    {
-                        my $around_parent = "";
-                        $around_parent = "\"" if ($options_types[$y] eq "string");
-                        $value .= $color1." -> ".$color4.$around_parent.$options_parent_values[$y].$around_parent;
-                    }
-                    else
-                    {
-                        $value .= $color1." -> ".$color3."null";
-                    }
-                }
-            }
-            my $strline = sprintf($format,
-                                  $color1, $options_names[$y], $padding,
-                                  $color2, $options_types[$y],
-                                  $color3, $around, $value, $around);
-            weechat::print_y($iset_buffer, $y, $strline);
-        }
-    }
-}
-
-sub iset_refresh
-{
-    iset_title();
-    if (($iset_buffer ne "") && ($#options_names >= 0))
-    {
-        foreach my $y (0 .. $#options_names)
-        {
-            iset_refresh_line($y);
-        }
-    }
-
-    weechat::bar_item_update("isetbar_help") if (weechat::config_boolean($options_iset{"show_help_bar"}) == 1);
-}
-
-sub iset_full_refresh
-{
-    $iset_buffer = weechat::buffer_search($LANG, $PRGNAME);
-    if ($iset_buffer ne "")
-    {
-        weechat::buffer_clear($iset_buffer) unless defined $_[0]; # iset_full_refresh(1) does a full refresh without clearing buffer
-        # search for "*" in $filter.
-        if ($filter =~ m/\*/ and $search_mode == 2)
-        {
-            iset_get_options("");
-        }
-        else
-        {
-            if ($search_mode == 0)
-            {
-                $search_value = "=" . $search_value;
-                iset_get_values($search_value);
-            }
-            elsif ($search_mode == 1)
-            {
-                iset_get_values($search_value);
-            }
-            elsif ($search_mode == 3)
-            {
-                iset_create_filter($filter);
-                iset_get_options($search_value);
-            }
-        }
-        if (weechat::config_boolean($options_iset{"show_plugin_description"}) == 1)
-        {
-            iset_set_current_line($current_line);
-        }else
-        {
-            $current_line = $#options_names if ($current_line > $#options_names);
-        }
-        iset_refresh();
-        weechat::command($iset_buffer, "/window refresh");
-    }
-}
-
-sub iset_set_current_line
-{
-    my $new_current_line = $_[0];
-    if ($new_current_line >= 0)
-    {
-        my $old_current_line = $current_line;
-        $current_line = $new_current_line;
-        $current_line = $#options_names if ($current_line > $#options_names);
-        if ($old_current_line != $current_line)
-        {
-            iset_refresh_line($old_current_line);
-            iset_refresh_line($current_line);
-            weechat::bar_item_update("isetbar_help") if (weechat::config_boolean($options_iset{"show_help_bar"}) == 1);
-        }
-    }
-}
-
-sub iset_signal_window_scrolled_cb
-{
-    my ($data, $signal, $signal_data) = ($_[0], $_[1], $_[2]);
-    if ($iset_buffer ne "")
-    {
-        my $infolist = weechat::infolist_get("window", $signal_data, "");
-        if (weechat::infolist_next($infolist))
-        {
-            if (weechat::infolist_pointer($infolist, "buffer") eq $iset_buffer)
-            {
-                my $old_current_line = $current_line;
-                my $new_current_line = $current_line;
-                my $start_line_y = weechat::infolist_integer($infolist, "start_line_y");
-                my $chat_height = weechat::infolist_integer($infolist, "chat_height");
-                $new_current_line += $chat_height if ($new_current_line < $start_line_y);
-                $new_current_line -= $chat_height if ($new_current_line >= $start_line_y + $chat_height);
-                $new_current_line = $start_line_y if ($new_current_line < $start_line_y);
-                $new_current_line = $start_line_y + $chat_height - 1 if ($new_current_line >= $start_line_y + $chat_height);
-                iset_set_current_line($new_current_line);
-            }
-        }
-        weechat::infolist_free($infolist);
-    }
-
-    return weechat::WEECHAT_RC_OK;
-}
-
-sub iset_get_window_number
-{
-    if ($iset_buffer ne "")
-    {
-        my $window = weechat::window_search_with_buffer($iset_buffer);
-        return "-window ".weechat::window_get_integer ($window, "number")." " if ($window ne "");
-    }
-    return "";
-}
-
-sub iset_check_line_outside_window
-{
-    if ($iset_buffer ne "")
-    {
-        undef my $infolist;
-        if ($wee_version_number >= 0x00030500)
-        {
-            my $window = weechat::window_search_with_buffer($iset_buffer);
-            $infolist = weechat::infolist_get("window", $window, "") if $window;
-        }
-        else
-        {
-            $infolist = weechat::infolist_get("window", "", "current");
-        }
-        if ($infolist)
-        {
-            if (weechat::infolist_next($infolist))
-            {
-                my $start_line_y = weechat::infolist_integer($infolist, "start_line_y");
-                my $chat_height = weechat::infolist_integer($infolist, "chat_height");
-                my $window_number = "";
-                if ($wee_version_number >= 0x00030500)
-                {
-                    $window_number = "-window ".weechat::infolist_integer($infolist, "number")." ";
-                }
-                if ($start_line_y > $current_line)
-                {
-                    weechat::command($iset_buffer, "/window scroll ".$window_number."-".($start_line_y - $current_line));
-                }
-                else
-                {
-                    if ($start_line_y <= $current_line - $chat_height)
-                    {
-                        weechat::command($iset_buffer, "/window scroll ".$window_number."+".($current_line - $start_line_y - $chat_height + 1));
-
-                    }
-                }
-            }
-            weechat::infolist_free($infolist);
-        }
-    }
-}
-
-sub iset_get_option_name_index
-{
-    my $option_name = $_[0];
-    my $index = 0;
-    while ($index <= $#options_names)
-    {
-        return -1 if ($options_names[$index] gt $option_name);
-        return $index if ($options_names[$index] eq $option_name);
-        $index++;
-    }
-    return -1;
-}
-
-sub iset_refresh_option
-{
-    my $option_name = $_[0];
-    my $index = $_[1];
-    my $infolist = weechat::infolist_get("option", "", $option_name);
-    if ($infolist)
-    {
-        weechat::infolist_next($infolist);
-        if (weechat::infolist_fields($infolist))
-        {
-            $options_parent_names[$index] = weechat::infolist_string($infolist, "parent_name");
-            $options_types[$index] = weechat::infolist_string($infolist, "type");
-            $options_values[$index] = weechat::infolist_string($infolist, "value");
-            $options_default_values[$index] = weechat::infolist_string($infolist, "default_value");
-            $options_is_null[$index] = weechat::infolist_integer($infolist, "value_is_null");
-            $options_parent_values[$index] = undef;
-            if ($options_parent_names[$index]
-                && (($wee_version_number < 0x00040300) || (weechat::infolist_search_var($infolist, "parent_value"))))
-            {
-                $options_parent_values[$index] = weechat::infolist_string($infolist, "parent_value");
-            }
-            iset_refresh_line($index);
-            iset_title() if ($option_name eq "iset.look.show_current_line");
-        }
-        else
-        {
-            iset_full_refresh(1);  # if not found, refresh fully without clearing buffer
-            weechat::print_y($iset_buffer, $#options_names + 1, "");
-        }
-        weechat::infolist_free($infolist);
-    }
-}
-
-sub iset_config_cb
-{
-    my ($data, $option_name, $value) = ($_[0], $_[1], $_[2]);
-
-    if ($iset_buffer ne "")
-    {
-        return weechat::WEECHAT_RC_OK if (weechat::info_get("weechat_upgrading", "") eq "1");
-
-        my $index = iset_get_option_name_index($option_name);
-        if ($index >= 0)
-        {
-            # refresh info about changed option
-            iset_refresh_option($option_name, $index);
-            # refresh any other option having this changed option as parent
-            foreach my $i (0 .. $#options_names)
-            {
-                if ($options_parent_names[$i] eq $option_name)
-                {
-                    iset_refresh_option($options_names[$i], $i);
-                }
-            }
-        }
-        else
-        {
-            iset_full_refresh() if ($option_name ne "weechat.bar.isetbar.hidden");
-        }
-    }
-
-    return weechat::WEECHAT_RC_OK;
-}
-
-sub iset_set_option
-{
-    my ($option, $value) = ($_[0],$_[1]);
-    if (defined $option and defined $value)
-    {
-        $option = weechat::config_get($option);
-        weechat::config_option_set($option, $value, 1) if ($option ne "");
-    }
-}
-
-sub iset_reset_option
-{
-    my $option = $_[0];
-    if (defined $option)
-    {
-        $option = weechat::config_get($option);
-        weechat::config_option_reset($option, 1) if ($option ne "");
-    }
-}
-
-sub iset_unset_option
-{
-    my $option = $_[0];
-    if (defined $option)
-    {
-        $option = weechat::config_get($option);
-        weechat::config_option_unset($option) if ($option ne "");
-    }
-}
-
-
-sub iset_cmd_cb
-{
-    my ($data, $buffer, $args) = ($_[0], $_[1], $_[2]);
-    my $filter_set = 0;
-#    $search_value = "";
-    if (($args ne "") && (substr($args, 0, 2) ne "**"))
-    {
-        my @cmd_array = split(/ /,$args);
-        my $array_count = @cmd_array;
-        if (substr($args, 0, 1) eq weechat::config_string($options_iset{"value_search_char"})
-        or (defined $cmd_array[0] and $cmd_array[0] eq weechat::config_string($options_iset{"value_search_char"}).weechat::config_string($options_iset{"value_search_char"})) )
-        {
-            $search_mode = 1;
-            my $search_value = substr($args, 1);  # cut value_search_char
-            if ($iset_buffer ne "")
-            {
-                weechat::buffer_clear($iset_buffer);
-                weechat::command($iset_buffer, "/window refresh");
-            }
-            weechat::buffer_set($iset_buffer, "localvar_set_iset_search_mode", $search_mode);
-            weechat::buffer_set($iset_buffer, "localvar_set_iset_search_value", $search_value);
-            iset_init();
-            iset_get_values($search_value);
-            iset_refresh();
-            weechat::buffer_set($iset_buffer, "display", "1");
-#            $filter = $var_value;
-            return weechat::WEECHAT_RC_OK;
-        }
-        else
-        {
-            # f/s option =value
-            # option =value
-            $search_mode = 2; # grep on option
-            if ( $array_count >= 2 and $cmd_array[0] ne "f" or $cmd_array[0] ne "s")
-            {
-                if ( defined $cmd_array[1] and substr($cmd_array[1], 0, 1) eq weechat::config_string($options_iset{"value_search_char"})
-                or defined $cmd_array[2] and substr($cmd_array[2], 0, 1) eq weechat::config_string($options_iset{"value_search_char"}) )
-                {
-                    $search_mode = 3; # grep on option and value
-                    $search_value = substr($cmd_array[1], 1);  # cut value_search_char
-                    $search_value = substr($cmd_array[2], 1) if ( $array_count > 2);  # cut value_search_char
-                }
-            }
-
-            # show all diff values
-            if ( $args eq "d")
-            {
-                $search_mode = 4;
-                $search_value = "*";
-                $args = $search_value;
-            }
-            if ( $array_count >= 2 and $cmd_array[0] eq "d")
-            {
-                $search_mode = 5;
-                $search_value = substr($cmd_array[1], 0);  # cut value_search_char
-                $search_value = substr($cmd_array[2], 0) if ( $array_count > 2);  # cut value_search_char
-                $args = $search_value;
-            }
-
-            iset_create_filter($args);
-            $filter_set = 1;
-            my $ptrbuf = weechat::buffer_search($LANG, $PRGNAME);
-
-            if ($ptrbuf eq "")
-            {
-                iset_init();
-                iset_get_options($search_value);
-                iset_full_refresh();
-                weechat::buffer_set(weechat::buffer_search($LANG, $PRGNAME), "display", "1");
-                weechat::buffer_set($iset_buffer, "localvar_set_iset_search_value", $search_value);
-                weechat::buffer_set($iset_buffer, "localvar_set_iset_search_mode", $search_mode);
-                return weechat::WEECHAT_RC_OK;
-            }
-            else
-            {
-                iset_get_options($search_value);
-                iset_full_refresh();
-                weechat::buffer_set($ptrbuf, "display", "1");
-            }
-        }
-    weechat::buffer_set($iset_buffer, "localvar_set_iset_search_mode", $search_mode);
-    weechat::buffer_set($iset_buffer, "localvar_set_iset_search_value", $search_value);
-    }
-    if ($iset_buffer eq "")
-    {
-        iset_init();
-        iset_get_options("");
-        iset_refresh();
-    }
-    else
-    {
-#        iset_get_options($search_value);
-        iset_full_refresh() if ($filter_set);
-    }
-
-    if ($args eq "")
-    {
-        weechat::buffer_set($iset_buffer, "display", "1");
-    }
-    else
-    {
-        if ($args eq "**refresh")
-        {
-            iset_full_refresh();
-        }
-        if ($args eq "**up")
-        {
-            if ($current_line > 0)
-            {
-                $current_line--;
-                iset_refresh_line($current_line + 1);
-                iset_refresh_line($current_line);
-                iset_check_line_outside_window();
-            }
-        }
-        if ($args eq "**down")
-        {
-            if ($current_line < $#options_names)
-            {
-                $current_line++;
-                iset_refresh_line($current_line - 1);
-                iset_refresh_line($current_line);
-                iset_check_line_outside_window();
-            }
-        }
-        if ($args eq "**left" && $wee_version_number >= 0x00030600)
-        {
-            weechat::command($iset_buffer, "/window scroll_horiz ".iset_get_window_number()."-".weechat::config_integer($options_iset{"scroll_horiz"})."%");
-        }
-        if ($args eq "**right" && $wee_version_number >= 0x00030600)
-        {
-            weechat::command($iset_buffer, "/window scroll_horiz ".iset_get_window_number().weechat::config_integer($options_iset{"scroll_horiz"})."%");
-        }
-        if ($args eq "**scroll_top")
-        {
-            my $old_current_line = $current_line;
-            $current_line = 0;
-            iset_refresh_line ($old_current_line);
-            iset_refresh_line ($current_line);
-            iset_title();
-            weechat::command($iset_buffer, "/window scroll_top ".iset_get_window_number());
-        }
-        if ($args eq "**scroll_bottom")
-        {
-            my $old_current_line = $current_line;
-            $current_line = $#options_names;
-            iset_refresh_line ($old_current_line);
-            iset_refresh_line ($current_line);
-            iset_title();
-            weechat::command($iset_buffer, "/window scroll_bottom ".iset_get_window_number());
-        }
-        if ($args eq "**toggle")
-        {
-            if ($options_types[$current_line] eq "boolean")
-            {
-                iset_set_option($options_names[$current_line], "toggle");
-            }
-        }
-        if ($args eq "**incr")
-        {
-            if (($options_types[$current_line] eq "integer")
-                || ($options_types[$current_line] eq "color"))
-            {
-                iset_set_option($options_names[$current_line], "++1");
-            }
-        }
-        if ($args eq "**decr")
-        {
-            if (($options_types[$current_line] eq "integer")
-                || ($options_types[$current_line] eq "color"))
-            {
-                iset_set_option($options_names[$current_line], "--1");
-            }
-        }
-        if ($args eq "**reset")
-        {
-            iset_reset_option($options_names[$current_line]);
-        }
-        if ($args eq "**unset")
-        {
-            iset_unset_option($options_names[$current_line]);
-        }
-        if ($args eq "**toggle_help")
-        {
-            if (weechat::config_boolean($options_iset{"show_help_bar"})  == 1)
-            {
-                weechat::config_option_set($options_iset{"show_help_bar"},0,1);
-                iset_show_bar(0);
-            }
-            else
-            {
-                weechat::config_option_set($options_iset{"show_help_bar"},1,1);
-                iset_show_bar(1);
-            }
-        }
-        if ($args eq "**toggle_show_plugin_desc")
-        {
-            if (weechat::config_boolean($options_iset{"show_plugin_description"}) == 1)
-            {
-                weechat::config_option_set($options_iset{"show_plugin_description"},0,1);
-                iset_full_refresh();
-                iset_check_line_outside_window();
-                iset_title();
-            }
-            else
-            {
-                weechat::config_option_set($options_iset{"show_plugin_description"},1,1);
-                iset_full_refresh();
-                iset_check_line_outside_window();
-                iset_title();
-            }
-        }
-        if ($args eq "**set")
-        {
-            my $quote = "";
-            my $value = $options_values[$current_line];
-            if ($options_is_null[$current_line])
-            {
-                $value = "";
-            }
-            else
-            {
-                $quote = "\"" if ($options_types[$current_line] eq "string");
-            }
-            $value = " ".$quote.$value.$quote if ($value ne "" or $quote ne "");
-
-            my $set_command = "/set";
-            my $start_index = 5;
-            if (weechat::config_boolean($options_iset{"use_mute"}) == 1)
-            {
-                $set_command = "/mute ".$set_command;
-                $start_index += 11;
-            }
-            $set_command = $set_command." ".$options_names[$current_line].$value;
-            my $pos_space = index($set_command, " ", $start_index);
-            if ($pos_space < 0)
-            {
-                $pos_space = 9999;
-            }
-            else
-            {
-                $pos_space = $pos_space + 1;
-                $pos_space = $pos_space + 1 if ($quote ne "");
-            }
-            weechat::buffer_set($iset_buffer, "input", $set_command);
-            weechat::buffer_set($iset_buffer, "input_pos", "".$pos_space);
-        }
-    }
-    weechat::bar_item_update("isetbar_help") if (weechat::config_boolean($options_iset{"show_help_bar"}) == 1);
-    return weechat::WEECHAT_RC_OK;
-}
-
-sub iset_get_help
-{
-    my ($redraw) = ($_[0]);
-
-    return '' if (weechat::config_boolean($options_iset{"show_help_bar"}) == 0);
-
-    if (not defined $options_names[$current_line])
-    {
-        return "No option selected. Set a new filter using command line (use '*' to see all options)";
-    }
-    if ($options_name_copy eq $options_names[$current_line] and not defined $redraw)
-    {
-        return $description;
-    }
-    $options_name_copy = $options_names[$current_line];
-    my $optionlist ="";
-    $optionlist = weechat::infolist_get("option", "", $options_names[$current_line]);
-    weechat::infolist_next($optionlist);
-    my $full_name = weechat::infolist_string($optionlist,"full_name");
-    my $option_desc = "";
-    my $option_default_value = "";
-    my $option_range = "";
-    my $possible_values = "";
-    my $re = qq(\Q$full_name);
-    if (grep (/^$re$/,$options_names[$current_line]))
-    {
-        $option_desc = weechat::infolist_string($optionlist, "description_nls");
-        $option_desc = weechat::infolist_string($optionlist, "description") if ($option_desc eq "");
-        $option_desc = "No help found" if ($option_desc eq "");
-        $option_default_value = weechat::infolist_string($optionlist, "default_value");
-        $possible_values = weechat::infolist_string($optionlist, "string_values") if (weechat::infolist_string($optionlist, "string_values") ne "");
-        if ((weechat::infolist_string($optionlist, "type") eq "integer") && ($possible_values eq ""))
-        {
-            $option_range = weechat::infolist_integer($optionlist, "min")
-                ." .. ".weechat::infolist_integer($optionlist, "max");
-        }
-    }
-    weechat::infolist_free($optionlist);
-    iset_title();
-
-    $description = weechat::color(weechat::config_color($options_iset{"color_help_option_name"})).$options_names[$current_line]
-        .weechat::color("bar_fg").": "
-        .weechat::color(weechat::config_color($options_iset{"color_help_text"})).$option_desc;
-
-    # show additional infos like default value and possible values
-
-    if (weechat::config_boolean($options_iset{"show_help_extra_info"}) == 1)
-    {
-        $description .=
-            weechat::color("bar_delim")." ["
-            .weechat::color("bar_fg")."default: "
-            .weechat::color("bar_delim")."\""
-            .weechat::color(weechat::config_color($options_iset{"color_help_default_value"})).$option_default_value
-            .weechat::color("bar_delim")."\"";
-        if ($option_range ne "")
-        {
-            $description .= weechat::color("bar_fg").", values: ".$option_range;
-        }
-        if ($possible_values ne "")
-        {
-            $possible_values =~ s/\|/", "/g;      # replace '|' to '", "'
-            $description .= weechat::color("bar_fg").", values: ". "\"" . $possible_values . "\"";
-
-        }
-        $description .= weechat::color("bar_delim")."]";
-    }
-    return $description;
-}
-
-sub iset_check_condition_isetbar_cb
-{
-    my ($data, $modifier, $modifier_data, $string) = ($_[0], $_[1], $_[2], $_[3]);
-    my $buffer = weechat::window_get_pointer($modifier_data, "buffer");
-    if ($buffer ne "")
-    {
-        if ((weechat::buffer_get_string($buffer, "plugin") eq $LANG)
-            && (weechat::buffer_get_string($buffer, "name") eq $PRGNAME))
-        {
-            return "1";
-        }
-    }
-    return "0";
-}
-
-sub iset_show_bar
-{
-    my $show = $_[0];
-    my $barhidden = weechat::config_get("weechat.bar.isetbar.hidden");
-    if ($barhidden)
-    {
-        if ($show)
-        {
-            if (weechat::config_boolean($options_iset{"show_help_bar"}) == 1)
-            {
-                if (weechat::config_boolean($barhidden))
-                {
-                    weechat::config_option_set($barhidden, 0, 1);
-                }
-            }
-        }
-        else
-        {
-            if (!weechat::config_boolean($barhidden))
-            {
-                weechat::config_option_set($barhidden, 1, 1);
-            }
-        }
-    }
-}
-
-sub iset_signal_buffer_switch_cb
-{
-    my $buffer_pointer = $_[2];
-    my $show_bar = 0;
-    $show_bar = 1 if (weechat::buffer_get_integer($iset_buffer, "num_displayed") > 0);
-    iset_show_bar($show_bar);
-    iset_check_line_outside_window() if ($buffer_pointer eq $iset_buffer);
-    return weechat::WEECHAT_RC_OK;
-}
-
-sub iset_item_cb
-{
-    return iset_get_help();
-}
-
-sub iset_upgrade_ended
-{
-    iset_full_refresh();
-}
-
-sub iset_end
-{
-    # when script is unloaded, we hide bar
-    iset_show_bar(0);
-}
-
-# -------------------------------[ mouse support ]-------------------------------------
-
-sub hook_focus_iset_cb
-{
-    my %info = %{$_[1]};
-    my $bar_item_line = int($info{"_bar_item_line"});
-    undef my $hash;
-    if (($info{"_buffer_name"} eq $PRGNAME) && $info{"_buffer_plugin"} eq $LANG && ($bar_item_line >= 0) && ($bar_item_line <= $#iset_focus))
-    {
-        $hash = $iset_focus[$bar_item_line];
-    }
-    else
-    {
-        $hash = {};
-        my $hash_focus = $iset_focus[0];
-        foreach my $key (keys %$hash_focus)
-        {
-            $hash->{$key} = "?";
-        }
-    }
-    return $hash;
-}
-
-# _chat_line_y contains selected line
-sub iset_hsignal_mouse_cb
-{
-    my ($data, $signal, %hash) = ($_[0], $_[1], %{$_[2]});
-
-    return weechat::WEECHAT_RC_OK unless (@options_types);
-
-    if ($hash{"_buffer_name"} eq $PRGNAME && ($hash{"_buffer_plugin"} eq $LANG))
-    {
-        if ($hash{"_key"} eq "button1")
-        {
-            iset_set_current_line($hash{"_chat_line_y"});
-        }
-        elsif ($hash{"_key"} eq "button2")
-        {
-            if ($options_types[$hash{"_chat_line_y"}] eq "boolean")
-            {
-                iset_set_option($options_names[$hash{"_chat_line_y"}], "toggle");
-                iset_set_current_line($hash{"_chat_line_y"});
-            }
-            elsif ($options_types[$hash{"_chat_line_y"}] eq "string")
-            {
-                iset_set_current_line($hash{"_chat_line_y"});
-                weechat::command("", "/$PRGNAME **set");
-            }
-        }
-        elsif ($hash{"_key"} eq "button2-gesture-left" or $hash{"_key"} eq "button2-gesture-left-long")
-        {
-            if ($options_types[$hash{"_chat_line_y"}] eq "integer" or ($options_types[$hash{"_chat_line_y"}] eq "color"))
-            {
-                iset_set_current_line($hash{"_chat_line_y"});
-                my $distance = distance($hash{"_chat_line_x"},$hash{"_chat_line_x2"});
-                weechat::command("", "/repeat $distance /$PRGNAME **decr");
-            }
-        }
-        elsif ($hash{"_key"} eq "button2-gesture-right" or $hash{"_key"} eq "button2-gesture-right-long")
-        {
-            if ($options_types[$hash{"_chat_line_y"}] eq "integer" or ($options_types[$hash{"_chat_line_y"}] eq "color"))
-            {
-                iset_set_current_line($hash{"_chat_line_y"});
-                my $distance = distance($hash{"_chat_line_x"},$hash{"_chat_line_x2"});
-                weechat::command("", "/repeat $distance /$PRGNAME **incr");
-            }
-        }
-    }
-    window_switch();
-}
-
-sub window_switch
-{
-    my $current_window = weechat::current_window();
-    my $dest_window = weechat::window_search_with_buffer(weechat::buffer_search("perl","iset"));
-    return 0 if ($dest_window eq "" or $current_window eq $dest_window);
-
-    my $infolist = weechat::infolist_get("window", $dest_window, "");
-    weechat::infolist_next($infolist);
-    my $number = weechat::infolist_integer($infolist, "number");
-    weechat::infolist_free($infolist);
-    weechat::command("","/window " . $number);
-}
-
-sub distance
-{
-    my ($x1,$x2) = ($_[0], $_[1]);
-    my $distance;
-    $distance = $x1 - $x2;
-    $distance = abs($distance);
-    if ($distance > 0)
-    {
-        use integer;
-        $distance  =  $distance / 3;
-        $distance = 1 if ($distance == 0);
-    }
-    elsif ($distance == 0)
-    {
-        $distance = 1;
-    }
-    return $distance;
-}
-
-# -----------------------------------[ config ]---------------------------------------
-
-sub iset_config_init
-{
-    $iset_config_file = weechat::config_new($ISET_CONFIG_FILE_NAME,"iset_config_reload_cb","");
-    return if ($iset_config_file eq "");
-
-    # section "color"
-    my $section_color = weechat::config_new_section($iset_config_file,"color", 0, 0, "", "", "", "", "", "", "", "", "", "");
-    if ($section_color eq "")
-    {
-        weechat::config_free($iset_config_file);
-        return;
-    }
-    $options_iset{"color_option"} = weechat::config_new_option(
-        $iset_config_file, $section_color,
-        "option", "color", "Color for option name in iset buffer", "", 0, 0,
-        "default", "default", 0, "", "", "full_refresh_cb", "", "", "");
-    $options_iset{"color_option_selected"} = weechat::config_new_option(
-        $iset_config_file, $section_color,
-        "option_selected", "color", "Color for selected option name in iset buffer", "", 0, 0,
-        "white", "white", 0, "", "", "full_refresh_cb", "", "", "");
-    $options_iset{"color_type"} = weechat::config_new_option(
-        $iset_config_file, $section_color,
-        "type", "color", "Color for option type (integer, boolean, string)", "", 0, 0,
-        "brown", "brown", 0, "", "", "full_refresh_cb", "", "", "");
-    $options_iset{"color_type_selected"} = weechat::config_new_option(
-        $iset_config_file, $section_color,
-        "type_selected", "color", "Color for selected option type (integer, boolean, string)", "", 0, 0,
-        "yellow", "yellow", 0, "", "", "full_refresh_cb", "", "", "");
-    $options_iset{"color_value"} = weechat::config_new_option(
-        $iset_config_file, $section_color,
-        "value", "color", "Color for option value", "", 0, 0,
-        "cyan", "cyan", 0, "", "", "full_refresh_cb", "", "", "");
-    $options_iset{"color_value_selected"} = weechat::config_new_option(
-        $iset_config_file, $section_color,
-        "value_selected", "color", "Color for selected option value", "", 0, 0,
-        "lightcyan", "lightcyan", 0, "", "", "full_refresh_cb", "", "", "");
-    $options_iset{"color_value_diff"} = weechat::config_new_option(
-        $iset_config_file, $section_color,
-        "value_diff", "color", "Color for option value different from default", "", 0, 0,
-        "magenta", "magenta", 0, "", "", "full_refresh_cb", "", "", "");
-    $options_iset{"color_value_diff_selected"} = weechat::config_new_option(
-        $iset_config_file, $section_color,
-        "value_diff_selected", "color", "Color for selected option value different from default", "", 0, 0,
-        "lightmagenta", "lightmagenta", 0, "", "", "full_refresh_cb", "", "", "");
-    $options_iset{"color_value_undef"} = weechat::config_new_option(
-        $iset_config_file, $section_color,
-        "value_undef", "color", "Color for option value undef", "", 0, 0,
-        "green", "green", 0, "", "", "full_refresh_cb", "", "", "");
-    $options_iset{"color_value_undef_selected"} = weechat::config_new_option(
-        $iset_config_file, $section_color,
-        "value_undef_selected", "color", "Color for selected option value undef", "", 0, 0,
-        "lightgreen", "lightgreen", 0, "", "", "full_refresh_cb", "", "", "");
-    $options_iset{"color_bg_selected"} = weechat::config_new_option(
-        $iset_config_file, $section_color,
-        "bg_selected", "color", "Background color for current selected option", "", 0, 0,
-        "red", "red", 0, "", "", "full_refresh_cb", "", "", "");
-    $options_iset{"color_help_option_name"} = weechat::config_new_option(
-        $iset_config_file, $section_color,
-        "help_option_name", "color", "Color for option name in help-bar", "", 0, 0,
-        "white", "white", 0, "", "", "bar_refresh", "", "", "");
-    $options_iset{"color_help_text"} = weechat::config_new_option(
-        $iset_config_file, $section_color,
-        "help_text", "color", "Color for option description in help-bar", "", 0, 0,
-        "default", "default", 0, "", "", "bar_refresh", "", "", "");
-    $options_iset{"color_help_default_value"} = weechat::config_new_option(
-        $iset_config_file, $section_color,
-        "help_default_value", "color", "Color for default option value in help-bar", "", 0, 0,
-        "green", "green", 0, "", "", "bar_refresh", "", "", "");
-
-    # section "help"
-    my $section_help = weechat::config_new_section($iset_config_file,"help", 0, 0, "", "", "", "", "", "", "", "", "", "");
-    if ($section_help eq "")
-    {
-        weechat::config_free($iset_config_file);
-        return;
-    }
-    $options_iset{"show_help_bar"} = weechat::config_new_option(
-        $iset_config_file, $section_help,
-        "show_help_bar", "boolean", "Show help bar", "", 0, 0,
-        "on", "on", 0, "", "", "toggle_help_cb", "", "", "");
-    $options_iset{"show_help_extra_info"} = weechat::config_new_option(
-        $iset_config_file, $section_help,
-        "show_help_extra_info", "boolean", "Show additional information in help bar (default value, max./min. value) ", "", 0, 0,
-        "on", "on", 0, "", "", "", "", "", "");
-    $options_iset{"show_plugin_description"} = weechat::config_new_option(
-        $iset_config_file, $section_help,
-        "show_plugin_description", "boolean", "Show plugin description in iset buffer", "", 0, 0,
-        "off", "off", 0, "", "", "full_refresh_cb", "", "", "");
-
-    # section "look"
-    my $section_look = weechat::config_new_section($iset_config_file, "look", 0, 0, "", "", "", "", "", "", "", "", "", "");
-    if ($section_look eq "")
-    {
-        weechat::config_free($iset_config_file);
-        return;
-    }
-    $options_iset{"value_search_char"} = weechat::config_new_option(
-        $iset_config_file, $section_look,
-        "value_search_char", "string", "Trigger char to tell iset to search for value instead of option (for example: =red)", "", 0, 0,
-        "=", "=", 0, "", "", "", "", "", "");
-    $options_iset{"scroll_horiz"} = weechat::config_new_option(
-        $iset_config_file, $section_look,
-        "scroll_horiz", "integer", "scroll content of iset buffer n%", "", 1, 100,
-        "10", "10", 0, "", "", "", "", "", "");
-    $options_iset{"show_current_line"} = weechat::config_new_option(
-        $iset_config_file, $section_look,
-        "show_current_line", "boolean", "show current line in title bar.", "", 0, 0,
-        "on", "on", 0, "", "", "", "", "", "");
-    $options_iset{"use_mute"} = weechat::config_new_option(
-        $iset_config_file, $section_look,
-        "use_mute", "boolean", "/mute command will be used in input bar", "", 0, 0,
-        "off", "off", 0, "", "", "", "", "", "");
-}
-
-sub iset_config_reload_cb
-{
-    my ($data,$config_file) = ($_[0], $_[1]);
-    return weechat::config_reload($config_file)
-}
-
-sub iset_config_read
-{
-    return weechat::config_read($iset_config_file) if ($iset_config_file ne "");
-}
-
-sub iset_config_write
-{
-    return weechat::config_write($iset_config_file) if ($iset_config_file ne "");
-}
-
-sub full_refresh_cb
-{
-    iset_full_refresh();
-    return weechat::WEECHAT_RC_OK;
-}
-
-sub bar_refresh
-{
-    iset_get_help(1);
-    weechat::bar_item_update("isetbar_help") if (weechat::config_boolean($options_iset{"show_help_bar"}) == 1);
-    return weechat::WEECHAT_RC_OK;
-}
-
-sub toggle_help_cb
-{
-    my $value = weechat::config_boolean($options_iset{"show_help_bar"});
-    iset_show_bar($value);
-    return weechat::WEECHAT_RC_OK;
-}
-
-# -----------------------------------[ main ]-----------------------------------------
-
-weechat::register($PRGNAME, $AUTHOR, $VERSION, $LICENSE,
-                  $DESCR, "iset_end", "");
-
-$wee_version_number = weechat::info_get("version_number", "") || 0;
-
-iset_config_init();
-iset_config_read();
-
-weechat::hook_command($PRGNAME, "Interactive set", "d <text> || f <file> || s <section> || [=][=]<text>",
-                      "d <text> : show only changed options\n".
-                      "f file   : show options for a file\n".
-                      "s section: show options for a section\n".
-                      "text     : show options with 'text' in name\n".
-                      weechat::config_string($options_iset{"value_search_char"})."text    : show options with 'text' in value\n".
-                      weechat::config_string($options_iset{"value_search_char"}).weechat::config_string($options_iset{"value_search_char"})."text   : show options with exact 'text' in value\n\n".
-                      "Keys for iset buffer:\n".
-                      "f11,f12        : move iset content left/right\n".
-                      "up,down        : move one option up/down\n".
-                      "pgup,pdwn      : move one page up/down\n".
-                      "home,end       : move to first/last option\n".
-                      "ctrl+'L'       : refresh options and screen\n".
-                      "alt+space      : toggle boolean on/off\n".
-                      "alt+'+'        : increase value (for integer or color)\n".
-                      "alt+'-'        : decrease value (for integer or color)\n".
-                      "alt+'i',alt+'r': reset value of option\n".
-                      "alt+'i',alt+'u': unset option\n".
-                      "alt+enter      : set new value for option (edit it with command line)\n".
-                      "text,enter     : set a new filter using command line (use '*' to see all options)\n".
-                      "alt+'v'        : toggle help bar on/off\n".
-                      "alt+'p'        : toggle option \"show_plugin_description\" on/off\n".
-                      "q              : as input in iset buffer to close it\n".
-                      "\n".
-                      "Mouse actions:\n".
-                      "wheel up/down                 : move cursor up/down\n".
-                      "left button                   : select an option from list\n".
-                      "right button                  : toggle boolean (on/off) or set a new value for option (edit it with command line)\n".
-                      "right button + drag left/right: increase/decrease value (for integer or color)\n".
-                      "\n".
-                      "Examples:\n".
-                      "  show changed options in 'aspell' plugin\n".
-                      "    /iset d aspell\n".
-                      "  show options for file 'irc'\n".
-                      "    /iset f irc\n".
-                      "  show options for section 'look'\n".
-                      "    /iset s look\n".
-                      "  show all options with text 'nicklist' in name\n".
-                      "    /iset nicklist\n".
-                      "  show all values which contain 'red'. ('" . weechat::config_string($options_iset{"value_search_char"}) . "' is a trigger char).\n".
-                      "    /iset ". weechat::config_string($options_iset{"value_search_char"}) ."red\n".
-                      "  show all values which hit 'off'. ('" . weechat::config_string($options_iset{"value_search_char"}) . weechat::config_string($options_iset{"value_search_char"}) . "' is a trigger char).\n".
-                      "    /iset ". weechat::config_string($options_iset{"value_search_char"}) . weechat::config_string($options_iset{"value_search_char"}) ."off\n".
-                      "  show options for file 'weechat' which contains value 'off'\n".
-                      "    /iset f weechat ".weechat::config_string($options_iset{"value_search_char"})."off\n".
-                      "",
-                      "", "iset_cmd_cb", "");
-weechat::hook_signal("upgrade_ended", "iset_upgrade_ended", "");
-weechat::hook_signal("window_scrolled", "iset_signal_window_scrolled_cb", "");
-weechat::hook_signal("buffer_switch", "iset_signal_buffer_switch_cb","");
-weechat::bar_item_new("isetbar_help", "iset_item_cb", "");
-weechat::bar_new("isetbar", "on", "0", "window", "", "top", "horizontal",
-                 "vertical", "3", "3", "default", "cyan", "default", "1",
-                 "isetbar_help");
-weechat::hook_modifier("bar_condition_isetbar", "iset_check_condition_isetbar_cb", "");
-weechat::hook_config("*", "iset_config_cb", "");
-$iset_buffer = weechat::buffer_search($LANG, $PRGNAME);
-iset_init() if ($iset_buffer ne "");
-
-if ($wee_version_number >= 0x00030600)
-{
-    weechat::hook_focus("chat", "hook_focus_iset_cb", "");
-    weechat::hook_hsignal($PRGNAME."_mouse", "iset_hsignal_mouse_cb", "");
-    weechat::key_bind("mouse", \%mouse_keys);
-}
diff --git a/.weechat/perl/perlexec.pl b/.weechat/perl/perlexec.pl
deleted file mode 100644
index 0490a761..00000000
--- a/.weechat/perl/perlexec.pl
+++ /dev/null
@@ -1,38 +0,0 @@
-# perlexec.pl by ArZa <arza@arza.us>: Execute perl code
-
-# This program is free software: you can modify/redistribute it under the terms of
-# GNU General Public License by Free Software Foundation, either version 3 or later
-# which you can get from <http://www.gnu.org/licenses/>.
-# This program is distributed in the hope that it will be useful, but without any warranty.
-
-weechat::register("perlexec", "ArZa <arza\@arza.us>", "0.1", "GPL3", "Execute perl code", "", "");
-weechat::hook_command("perlexec", "Execute perl code", "[code]",
-                      "Executes perl code given as an argument or creates a buffer for execution if not given an argument.\n\n".
-                      "Code is anything like in a weechat perl script, executed in one block.\n\n".
-                      "\$buffer is predefined as a pointer for the buffer where this command is executed.\n\n".
-                      "For example, close current buffer if it's a query:\n".
-                      "  /perlexec weechat::buffer_close(\$buffer) if weechat::buffer_get_string(\$buffer, \"localvar_type\") eq \"private\";",
-                      "", "perlexec", "");
-
-sub perlexec { # the command
-  if($_[2]){ # if got an argument
-    my $buffer=$_[1];
-    eval($_[2]); # execute
-  }else{
-    my $buffer=weechat::buffer_search("perl", "perlexec"); # find the buffer
-    if(!$buffer){ # if not found
-      $buffer=weechat::buffer_new("perlexec", "buffer_input", "", "", ""); # create it
-      weechat::buffer_set($buffer, "title", "Perl execution buffer"); # set title
-    }
-    if(weechat::current_buffer() eq $buffer){ weechat::buffer_close($buffer); } # if we already are in the buffer, close it
-    else{ weechat::buffer_set($buffer, "display", 1); } # otherwise, switch to it
-  }
-  return weechat::WEECHAT_RC_OK;
-}
-
-sub buffer_input { # input in the buffer
-  my $buffer=$_[1];
-  weechat::print($buffer, "> ".$_[2]); # print
-  eval($_[2]); # execute
-  return weechat::WEECHAT_RC_OK;
-}
diff --git a/.weechat/plugins.conf b/.weechat/plugins.conf
deleted file mode 100644
index cdc1fa4b..00000000
--- a/.weechat/plugins.conf
+++ /dev/null
@@ -1,126 +0,0 @@
-#
-# weechat -- plugins.conf
-#
-# WARNING: It is NOT recommended to edit this file by hand,
-# especially if WeeChat is running.
-#
-# Use /set or similar command to change settings in WeeChat.
-#
-# For more info, see: https://weechat.org/doc/quickstart
-#
-
-[var]
-fifo.fifo = "on"
-perl.check_license = "off"
-perl.highmon.alignment = "channel"
-perl.highmon.away_only = "off"
-perl.highmon.color_buf = "on"
-perl.highmon.first_run = "true"
-perl.highmon.hotlist_show = "off"
-perl.highmon.logging = "off"
-perl.highmon.merge_private = "off"
-perl.highmon.nick_prefix = "<"
-perl.highmon.nick_suffix = ">"
-perl.highmon.output = "buffer"
-perl.highmon.short_names = "off"
-python.check_license = "off"
-python.go.auto_jump = "off"
-python.go.buffer_number = "on"
-python.go.color_name = "black,cyan"
-python.go.color_name_highlight = "red,cyan"
-python.go.color_name_highlight_selected = "red,brown"
-python.go.color_name_selected = "black,brown"
-python.go.color_number = "yellow,magenta"
-python.go.color_number_selected = "yellow,red"
-python.go.fuzzy_search = "off"
-python.go.message = "Go to: "
-python.go.short_name = "off"
-python.go.sort = "number,beginning"
-python.go.use_core_instead_weechat = "off"
-python.urlserver.buffer_short_name = "off"
-python.urlserver.color = "darkgray"
-python.urlserver.color_in_msg = ""
-python.urlserver.debug = "off"
-python.urlserver.display_urls = "on"
-python.urlserver.display_urls_in_msg = "off"
-python.urlserver.http_allowed_ips = ""
-python.urlserver.http_auth = ""
-python.urlserver.http_auth_redirect = "on"
-python.urlserver.http_autostart = "on"
-python.urlserver.http_bg_color = "#f4f4f4"
-python.urlserver.http_css_url = ""
-python.urlserver.http_embed_image = "off"
-python.urlserver.http_embed_youtube = "off"
-python.urlserver.http_embed_youtube_size = "480*350"
-python.urlserver.http_fg_color = "#000"
-python.urlserver.http_hostname = "localhost"
-python.urlserver.http_hostname_display = ""
-python.urlserver.http_open_in_new_page = "on"
-python.urlserver.http_port = "60211"
-python.urlserver.http_port_display = ""
-python.urlserver.http_prefix_suffix = " "
-python.urlserver.http_scheme_display = "http"
-python.urlserver.http_time_format = "%d/%m/%y %H:%M:%S"
-python.urlserver.http_title = "WeeChat URLs"
-python.urlserver.http_url_prefix = ""
-python.urlserver.msg_filtered = "off"
-python.urlserver.msg_ignore_buffers = "core.weechat,python.grep"
-python.urlserver.msg_ignore_dup_urls = "off"
-python.urlserver.msg_ignore_regex = ""
-python.urlserver.msg_ignore_tags = "irc_quit,irc_part,notify_none"
-python.urlserver.msg_require_tags = "nick_"
-python.urlserver.separators = "[|]"
-python.urlserver.url_min_length = "0"
-python.urlserver.urls_amount = "100"
-ruby.check_license = "off"
-tcl.check_license = "off"
-
-[desc]
-python.go.auto_jump = "automatically jump to buffer when it is uniquely selected (default: "off")"
-python.go.buffer_number = "display buffer number (default: "on")"
-python.go.color_name = "color for buffer name (not selected) (default: "black,cyan")"
-python.go.color_name_highlight = "color for highlight in buffer name (not selected) (default: "red,cyan")"
-python.go.color_name_highlight_selected = "color for highlight in a selected buffer name (default: "red,brown")"
-python.go.color_name_selected = "color for a selected buffer name (default: "black,brown")"
-python.go.color_number = "color for buffer number (not selected) (default: "yellow,magenta")"
-python.go.color_number_selected = "color for selected buffer number (default: "yellow,red")"
-python.go.fuzzy_search = "search buffer matches using approximation (default: "off")"
-python.go.message = "message to display before list of buffers (default: "Go to: ")"
-python.go.short_name = "display and search in short names instead of buffer name (default: "off")"
-python.go.sort = "comma-separated list of keys to sort buffers (the order is important, sorts are performed in the given order): name = sort by name (or short name),  (default: "number,beginning")"
-python.go.use_core_instead_weechat = "use name "core" instead of "weechat" for core buffer (default: "off")"
-python.urlserver.buffer_short_name = "use buffer short name on dedicated buffer (default: "off")"
-python.urlserver.color = "color for urls displayed after message (default: "darkgray")"
-python.urlserver.color_in_msg = "color for urls displayed inside irc message: it is a number (irc color) between 00 and 15 (see doc for a list of irc colors) (default: "")"
-python.urlserver.debug = "print some debug messages (default: "off")"
-python.urlserver.display_urls = "display URLs below messages (default: "on")"
-python.urlserver.display_urls_in_msg = "add shorten url next to the original url (only in IRC messages) (useful for urlserver behind relay/irc) (default: "off")"
-python.urlserver.http_allowed_ips = "regex for IPs allowed to use server (example: "^(123.45.67.89|192.160.*)$") (default: "")"
-python.urlserver.http_auth = "login and password (format: "login:password") required to access to page with list of URLs (note: content is evaluated, see /help eval) (default: "")"
-python.urlserver.http_auth_redirect = "require the login/password (if option "http_auth" is set) for URLs redirections (default: "on")"
-python.urlserver.http_autostart = "start the built-in HTTP server automatically) (default: "on")"
-python.urlserver.http_bg_color = "background color for HTML page (default: "#f4f4f4")"
-python.urlserver.http_css_url = "URL of external Cascading Style Sheet to add (BE CAREFUL: the HTTP referer will be sent to site hosting CSS file!) (empty value = use default embedded CSS) (default: "")"
-python.urlserver.http_embed_image = "embed images in HTML page (BE CAREFUL: the HTTP referer will be sent to site hosting image!) (default: "off")"
-python.urlserver.http_embed_youtube = "embed youtube videos in HTML page (BE CAREFUL: the HTTP referer will be sent to youtube!) (default: "off")"
-python.urlserver.http_embed_youtube_size = "size for embedded youtube video, format is "xxx*yyy" (default: "480*350")"
-python.urlserver.http_fg_color = "foreground color for HTML page (default: "#000")"
-python.urlserver.http_hostname = "force hostname/IP in bind of socket (empty value = auto-detect current hostname) (default: "")"
-python.urlserver.http_hostname_display = "display this hostname in shortened URLs (default: "")"
-python.urlserver.http_open_in_new_page = "open links in new pages/tabs (default: "on")"
-python.urlserver.http_port = "force port for listening (empty value = find a random free port) (default: "")"
-python.urlserver.http_port_display = "display this port in shortened URLs. Useful if you forward a different external port to the internal port (default: "")"
-python.urlserver.http_prefix_suffix = "suffix displayed between prefix and message in HTML page (default: " ")"
-python.urlserver.http_scheme_display = "display this scheme in shortened URLs (default: "http")"
-python.urlserver.http_time_format = "time format in the HTML page (default: "%d/%m/%y %H:%M:%S")"
-python.urlserver.http_title = "title of the HTML page (default: "WeeChat URLs")"
-python.urlserver.http_url_prefix = "prefix to add in URLs to prevent external people to scan your URLs (for example: prefix "xx" will give URL: http://host.com:1234/xx/8) (default: "")"
-python.urlserver.msg_filtered = "shorten URLs in filtered messages (with /filter) (default: "off")"
-python.urlserver.msg_ignore_buffers = "comma-separated list (without spaces) of buffers to ignore (full name like "irc.freenode.#weechat") (default: "core.weechat,python.grep")"
-python.urlserver.msg_ignore_dup_urls = "ignore duplicated URLs (do not add an URL in list if it is already) (default: "off")"
-python.urlserver.msg_ignore_regex = "ignore messages matching this regex (default: "")"
-python.urlserver.msg_ignore_tags = "comma-separated list (without spaces) of tags (or beginning of tags) to ignore (for example, use "notify_none" to ignore self messages or "nick_weebot" to ignore messages from nick "weebot") (default: "irc_quit,irc_part,notify_none")"
-python.urlserver.msg_require_tags = "comma-separated list (without spaces) of tags (or beginning of tags) required to shorten URLs (for example "nick_" to shorten URLs only in messages from other users) (default: "nick_")"
-python.urlserver.separators = "separators for short url list (string with exactly 3 chars) (default: "[|]")"
-python.urlserver.url_min_length = "minimum length for an URL to be shortened (0 = shorten all URLs, -1 = detect length based on shorten URL) (default: "0")"
-python.urlserver.urls_amount = "number of URLs to keep in memory (and in file when script is not loaded) (default: "100")"
diff --git a/.weechat/python/autoload/autosort.py b/.weechat/python/autoload/autosort.py
deleted file mode 120000
index 1850897f..00000000
--- a/.weechat/python/autoload/autosort.py
+++ /dev/null
@@ -1 +0,0 @@
-../autosort.py
\ No newline at end of file
diff --git a/.weechat/python/autoload/colorize_nicks.py b/.weechat/python/autoload/colorize_nicks.py
deleted file mode 120000
index 3ee34e96..00000000
--- a/.weechat/python/autoload/colorize_nicks.py
+++ /dev/null
@@ -1 +0,0 @@
-../colorize_nicks.py
\ No newline at end of file
diff --git a/.weechat/python/autoload/go.py b/.weechat/python/autoload/go.py
deleted file mode 100644
index a30f58f0..00000000
--- a/.weechat/python/autoload/go.py
+++ /dev/null
@@ -1,561 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright (C) 2009-2014 Sébastien Helleu <flashcode@flashtux.org>
-# Copyright (C) 2010 m4v <lambdae2@gmail.com>
-# Copyright (C) 2011 stfn <stfnmd@googlemail.com>
-#
-# 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 <http://www.gnu.org/licenses/>.
-#
-
-#
-# History:
-#
-# 2017-04-01, Sébastien Helleu <flashcode@flashtux.org>:
-#     version 2.5: add option "buffer_number"
-# 2017-03-02, Sébastien Helleu <flashcode@flashtux.org>:
-#     version 2.4: fix syntax and indentation error
-# 2017-02-25, Simmo Saan <simmo.saan@gmail.com>
-#     version 2.3: fix fuzzy search breaking buffer number search display
-# 2016-01-28, ylambda <ylambda@koalabeast.com>
-#     version 2.2: add option "fuzzy_search"
-# 2015-11-12, nils_2 <weechatter@arcor.de>
-#     version 2.1: fix problem with buffer short_name "weechat", using option
-#                  "use_core_instead_weechat", see:
-#                  https://github.com/weechat/weechat/issues/574
-# 2014-05-12, Sébastien Helleu <flashcode@flashtux.org>:
-#     version 2.0: add help on options, replace option "sort_by_activity" by
-#                  "sort" (add sort by name and first match at beginning of
-#                  name and by number), PEP8 compliance
-# 2012-11-26, Nei <anti.teamidiot.de>
-#     version 1.9: add auto_jump option to automatically go to buffer when it
-#                  is uniquely selected
-# 2012-09-17, Sébastien Helleu <flashcode@flashtux.org>:
-#     version 1.8: fix jump to non-active merged buffers (jump with buffer name
-#                  instead of number)
-# 2012-01-03 nils_2 <weechatter@arcor.de>
-#     version 1.7: add option "use_core_instead_weechat"
-# 2012-01-03, Sébastien Helleu <flashcode@flashtux.org>:
-#     version 1.6: make script compatible with Python 3.x
-# 2011-08-24, stfn <stfnmd@googlemail.com>:
-#     version 1.5: /go with name argument jumps directly to buffer
-#                  Remember cursor position in buffer input
-# 2011-05-31, Elián Hanisch <lambdae2@gmail.com>:
-#     version 1.4: Sort list of buffers by activity.
-# 2011-04-25, Sébastien Helleu <flashcode@flashtux.org>:
-#     version 1.3: add info "go_running" (used by script input_lock.rb)
-# 2010-11-01, Sébastien Helleu <flashcode@flashtux.org>:
-#     version 1.2: use high priority for hooks to prevent conflict with other
-#                  plugins/scripts (WeeChat >= 0.3.4 only)
-# 2010-03-25, Elián Hanisch <lambdae2@gmail.com>:
-#     version 1.1: use a space to match the end of a string
-# 2009-11-16, Sébastien Helleu <flashcode@flashtux.org>:
-#     version 1.0: add new option to display short names
-# 2009-06-15, Sébastien Helleu <flashcode@flashtux.org>:
-#     version 0.9: fix typo in /help go with command /key
-# 2009-05-16, Sébastien Helleu <flashcode@flashtux.org>:
-#     version 0.8: search buffer by number, fix bug when window is split
-# 2009-05-03, Sébastien Helleu <flashcode@flashtux.org>:
-#     version 0.7: eat tab key (do not complete input, just move buffer
-#                  pointer)
-# 2009-05-02, Sébastien Helleu <flashcode@flashtux.org>:
-#     version 0.6: sync with last API changes
-# 2009-03-22, Sébastien Helleu <flashcode@flashtux.org>:
-#     version 0.5: update modifier signal name for input text display,
-#                  fix arguments for function string_remove_color
-# 2009-02-18, Sébastien Helleu <flashcode@flashtux.org>:
-#     version 0.4: do not hook command and init options if register failed
-# 2009-02-08, Sébastien Helleu <flashcode@flashtux.org>:
-#     version 0.3: case insensitive search for buffers names
-# 2009-02-08, Sébastien Helleu <flashcode@flashtux.org>:
-#     version 0.2: add help about Tab key
-# 2009-02-08, Sébastien Helleu <flashcode@flashtux.org>:
-#     version 0.1: initial release
-#
-
-"""
-Quick jump to buffers.
-(this script requires WeeChat 0.3.0 or newer)
-"""
-
-from __future__ import print_function
-
-SCRIPT_NAME = 'go'
-SCRIPT_AUTHOR = 'Sébastien Helleu <flashcode@flashtux.org>'
-SCRIPT_VERSION = '2.5'
-SCRIPT_LICENSE = 'GPL3'
-SCRIPT_DESC = 'Quick jump to buffers'
-
-SCRIPT_COMMAND = 'go'
-
-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
-
-import re
-
-# script options
-SETTINGS = {
-    'color_number': (
-        'yellow,magenta',
-        'color for buffer number (not selected)'),
-    'color_number_selected': (
-        'yellow,red',
-        'color for selected buffer number'),
-    'color_name': (
-        'black,cyan',
-        'color for buffer name (not selected)'),
-    'color_name_selected': (
-        'black,brown',
-        'color for a selected buffer name'),
-    'color_name_highlight': (
-        'red,cyan',
-        'color for highlight in buffer name (not selected)'),
-    'color_name_highlight_selected': (
-        'red,brown',
-        'color for highlight in a selected buffer name'),
-    'message': (
-        'Go to: ',
-        'message to display before list of buffers'),
-    'short_name': (
-        'off',
-        'display and search in short names instead of buffer name'),
-    'sort': (
-        'number,beginning',
-        'comma-separated list of keys to sort buffers '
-        '(the order is important, sorts are performed in the given order): '
-        'name = sort by name (or short name), ',
-        'hotlist = sort by hotlist order, '
-        'number = first match a buffer number before digits in name, '
-        'beginning = first match at beginning of names (or short names); '
-        'the default sort of buffers is by numbers'),
-    'use_core_instead_weechat': (
-        'off',
-        'use name "core" instead of "weechat" for core buffer'),
-    'auto_jump': (
-        'off',
-        'automatically jump to buffer when it is uniquely selected'),
-    'fuzzy_search': (
-        'off',
-        'search buffer matches using approximation'),
-    'buffer_number': (
-        'on',
-        'display buffer number'),
-}
-
-# hooks management
-HOOK_COMMAND_RUN = {
-    'input': ('/input *', 'go_command_run_input'),
-    'buffer': ('/buffer *', 'go_command_run_buffer'),
-    'window': ('/window *', 'go_command_run_window'),
-}
-hooks = {}
-
-# input before command /go (we'll restore it later)
-saved_input = ''
-saved_input_pos = 0
-
-# last user input (if changed, we'll update list of matching buffers)
-old_input = None
-
-# matching buffers
-buffers = []
-buffers_pos = 0
-
-
-def go_option_enabled(option):
-    """Checks if a boolean script option is enabled or not."""
-    return weechat.config_string_to_boolean(weechat.config_get_plugin(option))
-
-
-def go_info_running(data, info_name, arguments):
-    """Returns "1" if go is running, otherwise "0"."""
-    return '1' if 'modifier' in hooks else '0'
-
-
-def go_unhook_one(hook):
-    """Unhook something hooked by this script."""
-    global hooks
-    if hook in hooks:
-        weechat.unhook(hooks[hook])
-        del hooks[hook]
-
-
-def go_unhook_all():
-    """Unhook all."""
-    go_unhook_one('modifier')
-    for hook in HOOK_COMMAND_RUN:
-        go_unhook_one(hook)
-
-
-def go_hook_all():
-    """Hook command_run and modifier."""
-    global hooks
-    priority = ''
-    version = weechat.info_get('version_number', '') or 0
-    # use high priority for hook to prevent conflict with other plugins/scripts
-    # (WeeChat >= 0.3.4 only)
-    if int(version) >= 0x00030400:
-        priority = '2000|'
-    for hook, value in HOOK_COMMAND_RUN.items():
-        if hook not in hooks:
-            hooks[hook] = weechat.hook_command_run(
-                '%s%s' % (priority, value[0]),
-                value[1], '')
-    if 'modifier' not in hooks:
-        hooks['modifier'] = weechat.hook_modifier(
-            'input_text_display_with_cursor', 'go_input_modifier', '')
-
-
-def go_start(buf):
-    """Start go on buffer."""
-    global saved_input, saved_input_pos, old_input, buffers_pos
-    go_hook_all()
-    saved_input = weechat.buffer_get_string(buf, 'input')
-    saved_input_pos = weechat.buffer_get_integer(buf, 'input_pos')
-    weechat.buffer_set(buf, 'input', '')
-    old_input = None
-    buffers_pos = 0
-
-
-def go_end(buf):
-    """End go on buffer."""
-    global saved_input, saved_input_pos, old_input
-    go_unhook_all()
-    weechat.buffer_set(buf, 'input', saved_input)
-    weechat.buffer_set(buf, 'input_pos', str(saved_input_pos))
-    old_input = None
-
-
-def go_match_beginning(buf, string):
-    """Check if a string matches the beginning of buffer name/short name."""
-    if not string:
-        return False
-    esc_str = re.escape(string)
-    if re.search(r'^#?' + esc_str, buf['name']) \
-            or re.search(r'^#?' + esc_str, buf['short_name']):
-        return True
-    return False
-
-
-def go_match_fuzzy(name, string):
-    """Check if string matches name using approximation."""
-    if not string:
-        return False
-
-    name_len = len(name)
-    string_len = len(string)
-
-    if string_len > name_len:
-        return False
-    if name_len == string_len:
-        return name == string
-
-    # Attempt to match all chars somewhere in name
-    prev_index = -1
-    for i, char in enumerate(string):
-        index = name.find(char, prev_index+1)
-        if index == -1:
-            return False
-        prev_index = index
-    return True
-
-
-def go_now(buf, args):
-    """Go to buffer specified by args."""
-    listbuf = go_matching_buffers(args)
-    if not listbuf:
-        return
-
-    # prefer buffer that matches at beginning (if option is enabled)
-    if 'beginning' in weechat.config_get_plugin('sort').split(','):
-        for index in range(len(listbuf)):
-            if go_match_beginning(listbuf[index], args):
-                weechat.command(buf,
-                                '/buffer ' + str(listbuf[index]['full_name']))
-                return
-
-    # jump to first buffer in matching buffers by default
-    weechat.command(buf, '/buffer ' + str(listbuf[0]['full_name']))
-
-
-def go_cmd(data, buf, args):
-    """Command "/go": just hook what we need."""
-    global hooks
-    if args:
-        go_now(buf, args)
-    elif 'modifier' in hooks:
-        go_end(buf)
-    else:
-        go_start(buf)
-    return weechat.WEECHAT_RC_OK
-
-
-def go_matching_buffers(strinput):
-    """Return a list with buffers matching user input."""
-    global buffers_pos
-    listbuf = []
-    if len(strinput) == 0:
-        buffers_pos = 0
-    strinput = strinput.lower()
-    infolist = weechat.infolist_get('buffer', '', '')
-    while weechat.infolist_next(infolist):
-        short_name = weechat.infolist_string(infolist, 'short_name')
-        if go_option_enabled('short_name'):
-            name = weechat.infolist_string(infolist, 'short_name')
-        else:
-            name = weechat.infolist_string(infolist, 'name')
-        if name == 'weechat' \
-                and go_option_enabled('use_core_instead_weechat') \
-                and weechat.infolist_string(infolist, 'plugin_name') == 'core':
-            name = 'core'
-        number = weechat.infolist_integer(infolist, 'number')
-        full_name = weechat.infolist_string(infolist, 'full_name')
-        if not full_name:
-            full_name = '%s.%s' % (
-                weechat.infolist_string(infolist, 'plugin_name'),
-                weechat.infolist_string(infolist, 'name'))
-        pointer = weechat.infolist_pointer(infolist, 'pointer')
-        matching = name.lower().find(strinput) >= 0
-        if not matching and strinput[-1] == ' ':
-            matching = name.lower().endswith(strinput.strip())
-        if not matching and go_option_enabled('fuzzy_search'):
-            matching = go_match_fuzzy(name.lower(), strinput)
-        if not matching and strinput.isdigit():
-            matching = str(number).startswith(strinput)
-        if len(strinput) == 0 or matching:
-            listbuf.append({
-                'number': number,
-                'short_name': short_name,
-                'name': name,
-                'full_name': full_name,
-                'pointer': pointer,
-            })
-    weechat.infolist_free(infolist)
-
-    # sort buffers
-    hotlist = []
-    infolist = weechat.infolist_get('hotlist', '', '')
-    while weechat.infolist_next(infolist):
-        hotlist.append(
-            weechat.infolist_pointer(infolist, 'buffer_pointer'))
-    weechat.infolist_free(infolist)
-    last_index_hotlist = len(hotlist)
-
-    def _sort_name(buf):
-        """Sort buffers by name (or short name)."""
-        return buf['name']
-
-    def _sort_hotlist(buf):
-        """Sort buffers by hotlist order."""
-        try:
-            return hotlist.index(buf['pointer'])
-        except ValueError:
-            # not in hotlist, always last.
-            return last_index_hotlist
-
-    def _sort_match_number(buf):
-        """Sort buffers by match on number."""
-        return 0 if str(buf['number']) == strinput else 1
-
-    def _sort_match_beginning(buf):
-        """Sort buffers by match at beginning."""
-        return 0 if go_match_beginning(buf, strinput) else 1
-
-    funcs = {
-        'name': _sort_name,
-        'hotlist': _sort_hotlist,
-        'number': _sort_match_number,
-        'beginning': _sort_match_beginning,
-    }
-
-    for key in weechat.config_get_plugin('sort').split(','):
-        if key in funcs:
-            listbuf = sorted(listbuf, key=funcs[key])
-
-    if not strinput:
-        index = [i for i, buf in enumerate(listbuf)
-                 if buf['pointer'] == weechat.current_buffer()]
-        if index:
-            buffers_pos = index[0]
-
-    return listbuf
-
-
-def go_buffers_to_string(listbuf, pos, strinput):
-    """Return string built with list of buffers found (matching user input)."""
-    string = ''
-    strinput = strinput.lower()
-    for i in range(len(listbuf)):
-        selected = '_selected' if i == pos else ''
-        buffer_name = listbuf[i]['name']
-        index = buffer_name.lower().find(strinput)
-        if index >= 0:
-            index2 = index + len(strinput)
-            name = '%s%s%s%s%s' % (
-                buffer_name[:index],
-                weechat.color(weechat.config_get_plugin(
-                    'color_name_highlight' + selected)),
-                buffer_name[index:index2],
-                weechat.color(weechat.config_get_plugin(
-                    'color_name' + selected)),
-                buffer_name[index2:])
-        elif go_option_enabled("fuzzy_search") and \
-                go_match_fuzzy(buffer_name.lower(), strinput):
-            name = ""
-            prev_index = -1
-            for char in strinput.lower():
-                index = buffer_name.lower().find(char, prev_index+1)
-                if prev_index < 0:
-                    name += buffer_name[:index]
-                    name += weechat.color(weechat.config_get_plugin(
-                        'color_name_highlight' + selected))
-                if prev_index >= 0 and index > prev_index+1:
-                    name += weechat.color(weechat.config_get_plugin(
-                        'color_name' + selected))
-                    name += buffer_name[prev_index+1:index]
-                    name += weechat.color(weechat.config_get_plugin(
-                        'color_name_highlight' + selected))
-                name += buffer_name[index]
-                prev_index = index
-
-            name += weechat.color(weechat.config_get_plugin(
-                'color_name' + selected))
-            name += buffer_name[prev_index+1:]
-        else:
-            name = buffer_name
-        string += ' '
-        if go_option_enabled('buffer_number'):
-            string += '%s%s' % (
-                weechat.color(weechat.config_get_plugin(
-                    'color_number' + selected)),
-                str(listbuf[i]['number']))
-        string += '%s%s%s' % (
-            weechat.color(weechat.config_get_plugin(
-                'color_name' + selected)),
-            name,
-            weechat.color('reset'))
-    return '  ' + string if string else ''
-
-
-def go_input_modifier(data, modifier, modifier_data, string):
-    """This modifier is called when input text item is built by WeeChat.
-
-    This is commonly called after changes in input or cursor move: it builds
-    a new input with prefix ("Go to:"), and suffix (list of buffers found).
-    """
-    global old_input, buffers, buffers_pos
-    if modifier_data != weechat.current_buffer():
-        return ''
-    names = ''
-    new_input = weechat.string_remove_color(string, '')
-    new_input = new_input.lstrip()
-    if old_input is None or new_input != old_input:
-        old_buffers = buffers
-        buffers = go_matching_buffers(new_input)
-        if buffers != old_buffers and len(new_input) > 0:
-            if len(buffers) == 1 and go_option_enabled('auto_jump'):
-                weechat.command(modifier_data, '/wait 1ms /input return')
-            buffers_pos = 0
-        old_input = new_input
-    names = go_buffers_to_string(buffers, buffers_pos, new_input.strip())
-    return weechat.config_get_plugin('message') + string + names
-
-
-def go_command_run_input(data, buf, command):
-    """Function called when a command "/input xxx" is run."""
-    global buffers, buffers_pos
-    if command == '/input search_text' or command.find('/input jump') == 0:
-        # search text or jump to another buffer is forbidden now
-        return weechat.WEECHAT_RC_OK_EAT
-    elif command == '/input complete_next':
-        # choose next buffer in list
-        buffers_pos += 1
-        if buffers_pos >= len(buffers):
-            buffers_pos = 0
-        weechat.hook_signal_send('input_text_changed',
-                                 weechat.WEECHAT_HOOK_SIGNAL_STRING, '')
-        return weechat.WEECHAT_RC_OK_EAT
-    elif command == '/input complete_previous':
-        # choose previous buffer in list
-        buffers_pos -= 1
-        if buffers_pos < 0:
-            buffers_pos = len(buffers) - 1
-        weechat.hook_signal_send('input_text_changed',
-                                 weechat.WEECHAT_HOOK_SIGNAL_STRING, '')
-        return weechat.WEECHAT_RC_OK_EAT
-    elif command == '/input return':
-        # switch to selected buffer (if any)
-        go_end(buf)
-        if len(buffers) > 0:
-            weechat.command(
-                buf, '/buffer ' + str(buffers[buffers_pos]['full_name']))
-        return weechat.WEECHAT_RC_OK_EAT
-    return weechat.WEECHAT_RC_OK
-
-
-def go_command_run_buffer(data, buf, command):
-    """Function called when a command "/buffer xxx" is run."""
-    return weechat.WEECHAT_RC_OK_EAT
-
-
-def go_command_run_window(data, buf, command):
-    """Function called when a command "/window xxx" is run."""
-    return weechat.WEECHAT_RC_OK_EAT
-
-
-def go_unload_script():
-    """Function called when script is unloaded."""
-    go_unhook_all()
-    return weechat.WEECHAT_RC_OK
-
-
-def go_main():
-    """Entry point."""
-    if not weechat.register(SCRIPT_NAME, SCRIPT_AUTHOR, SCRIPT_VERSION,
-                            SCRIPT_LICENSE, SCRIPT_DESC,
-                            'go_unload_script', ''):
-        return
-    weechat.hook_command(
-        SCRIPT_COMMAND,
-        'Quick jump to buffers', '[name]',
-        'name: directly jump to buffer by name (without argument, list is '
-        'displayed)\n\n'
-        'You can bind command to a key, for example:\n'
-        '  /key bind meta-g /go\n\n'
-        'You can use completion key (commonly Tab and shift-Tab) to select '
-        'next/previous buffer in list.',
-        '%(buffers_names)',
-        'go_cmd', '')
-
-    # set default settings
-    version = weechat.info_get('version_number', '') or 0
-    for option, value in SETTINGS.items():
-        if not weechat.config_is_set_plugin(option):
-            weechat.config_set_plugin(option, value[0])
-        if int(version) >= 0x00030500:
-            weechat.config_set_desc_plugin(
-                option, '%s (default: "%s")' % (value[1], value[0]))
-    weechat.hook_info('go_running',
-                      'Return "1" if go is running, otherwise "0"',
-                      '',
-                      'go_info_running', '')
-
-
-if __name__ == "__main__" and IMPORT_OK:
-    go_main()
diff --git a/.weechat/python/autoload/urlserver.py b/.weechat/python/autoload/urlserver.py
deleted file mode 120000
index 319fd20d..00000000
--- a/.weechat/python/autoload/urlserver.py
+++ /dev/null
@@ -1 +0,0 @@
-../urlserver.py
\ No newline at end of file
diff --git a/.weechat/python/autosort.py b/.weechat/python/autosort.py
deleted file mode 100644
index 6854b9e6..00000000
--- a/.weechat/python/autosort.py
+++ /dev/null
@@ -1,885 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright (C) 2013-2014 Maarten de Vries <maarten@de-vri.es>
-#
-# 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 <http://www.gnu.org/licenses/>.
-#
-
-#
-# Autosort automatically keeps your buffers sorted and grouped by server.
-# You can define your own sorting rules. See /help autosort for more details.
-#
-# http://github.com/de-vri.es/weechat-autosort
-#
-
-#
-# Changelog:
-# 2.8:
-#   * Fix compatibility with python 3 regarding unicode handling.
-# 2.7:
-#   * Fix sorting of buffers with spaces in their name.
-# 2.6:
-#   * Ignore case in rules when doing case insensitive sorting.
-# 2.5:
-#   * Fix handling unicode buffer names.
-#   * Add hint to set irc.look.server_buffer to independent and buffers.look.indenting to on.
-# 2.4:
-#   * Make script python3 compatible.
-# 2.3:
-#   * Fix sorting items without score last (regressed in 2.2).
-# 2.2:
-#   * Add configuration option for signals that trigger a sort.
-#   * Add command to manually trigger a sort (/autosort sort).
-#   * Add replacement patterns to apply before sorting.
-# 2.1:
-#   * Fix some minor style issues.
-# 2.0:
-#   * Allow for custom sort rules.
-#
-
-
-import weechat
-import re
-import json
-
-SCRIPT_NAME     = 'autosort'
-SCRIPT_AUTHOR   = 'Maarten de Vries <maarten@de-vri.es>'
-SCRIPT_VERSION  = '2.8'
-SCRIPT_LICENSE  = 'GPL3'
-SCRIPT_DESC     = 'Automatically or manually keep your buffers sorted and grouped by server.'
-
-
-config = None
-hooks  = []
-
-class HumanReadableError(Exception):
-	pass
-
-
-def parse_int(arg, arg_name = 'argument'):
-	''' Parse an integer and provide a more human readable error. '''
-	arg = arg.strip()
-	try:
-		return int(arg)
-	except ValueError:
-		raise HumanReadableError('Invalid {0}: expected integer, got "{1}".'.format(arg_name, arg))
-
-
-class Pattern:
-	''' A simple glob-like pattern for matching buffer names. '''
-
-	def __init__(self, pattern, case_sensitive):
-		''' Construct a pattern from a string. '''
-		escaped    = False
-		char_class = 0
-		chars      = ''
-		regex      = ''
-		for c in pattern:
-			if escaped and char_class:
-				escaped = False
-				chars += re.escape(c)
-			elif escaped:
-				escaped = False
-				regex += re.escape(c)
-			elif c == '\\':
-				escaped = True
-			elif c == '*' and not char_class:
-				regex += '[^.]*'
-			elif c == '?' and not char_class:
-				regex += '[^.]'
-			elif c == '[' and not char_class:
-				char_class = 1
-				chars    = ''
-			elif c == '^' and char_class and not chars:
-				chars += '^'
-			elif c == ']' and char_class and chars not in ('', '^'):
-				char_class = False
-				regex += '[' + chars + ']'
-			elif c == '-' and char_class:
-				chars += '-'
-			elif char_class:
-				chars += re.escape(c)
-			else:
-				regex += re.escape(c)
-
-		if char_class:
-			raise ValueError("unmatched opening '['")
-		if escaped:
-			raise ValueError("unexpected trailing '\\'")
-
-		if case_sensitive:
-			self.regex   = re.compile('^' + regex + '$')
-		else:
-			self.regex   = re.compile('^' + regex + '$', flags = re.IGNORECASE)
-		self.pattern = pattern
-
-	def match(self, input):
-		''' Match the pattern against a string. '''
-		return self.regex.match(input)
-
-
-class FriendlyList(object):
-	''' A list with human readable errors. '''
-
-	def __init__(self):
-		self.__data = []
-
-	def raw(self):
-		return self.__data
-
-	def append(self, value):
-		''' Add a rule to the list. '''
-		self.__data.append(value)
-
-	def insert(self, index, value):
-		''' Add a rule to the list. '''
-		if not 0 <= index <= len(self): raise HumanReadableError('Index out of range: expected an integer in the range [0, {0}], got {1}.'.format(len(self), index))
-		self.__data.insert(index, value)
-
-	def pop(self, index):
-		''' Remove a rule from the list and return it. '''
-		if not 0 <= index < len(self): raise HumanReadableError('Index out of range: expected an integer in the range [0, {0}), got {1}.'.format(len(self), index))
-		return self.__data.pop(index)
-
-	def move(self, index_a, index_b):
-		''' Move a rule to a new position in the list. '''
-		self.insert(index_b, self.pop(index_a))
-
-	def swap(self, index_a, index_b):
-		''' Swap two elements in the list. '''
-		self[index_a], self[index_b] = self[index_b], self[index_a]
-
-	def __len__(self):
-		return len(self.__data)
-
-	def __getitem__(self, index):
-		if not 0 <= index < len(self): raise HumanReadableError('Index out of range: expected an integer in the range [0, {0}), got {1}.'.format(len(self), index))
-		return self.__data[index]
-
-	def __setitem__(self, index, value):
-		if not 0 <= index < len(self): raise HumanReadableError('Index out of range: expected an integer in the range [0, {0}), got {1}.'.format(len(self), index))
-		self.__data[index] = value
-
-	def __iter__(self):
-		return iter(self.__data)
-
-
-class RuleList(FriendlyList):
-	''' A list of rules to test buffer names against. '''
-	rule_regex = re.compile(r'^(.*)=\s*([+-]?[^=]*)$')
-
-	def __init__(self, rules):
-		''' Construct a RuleList from a list of rules. '''
-		super(RuleList, self).__init__()
-		for rule in rules: self.append(rule)
-
-	def get_score(self, name):
-		''' Get the sort score of a partial name according to a rule list. '''
-		for rule in self:
-			if rule[0].match(name): return rule[1]
-		return 999999999
-
-	def encode(self):
-		''' Encode the rules for storage. '''
-		return json.dumps(list(map(lambda x: (x[0].pattern, x[1]), self)))
-
-	@staticmethod
-	def decode(blob, case_sensitive):
-		''' Parse rules from a string blob. '''
-		result = []
-
-		try:
-			decoded = json.loads(blob)
-		except ValueError:
-			log('Invalid rules: expected JSON encoded list of pairs, got "{0}".'.format(blob))
-			return [], 0
-
-		for rule in decoded:
-			# Rules must be a pattern,score pair.
-			if len(rule) != 2:
-				log('Invalid rule: expected (pattern, score), got "{0}". Rule ignored.'.format(rule))
-				continue
-
-			# Rules must have a valid pattern.
-			try:
-				pattern = Pattern(rule[0], case_sensitive)
-			except ValueError as e:
-				log('Invalid pattern: {0} in "{1}". Rule ignored.'.format(e, rule[0]))
-				continue
-
-			# Rules must have a valid score.
-			try:
-				score = int(rule[1])
-			except ValueError as e:
-				log('Invalid score: expected an integer, got "{0}". Rule ignored.'.format(score))
-				continue
-
-			result.append((pattern, score))
-
-		return RuleList(result)
-
-	@staticmethod
-	def parse_rule(arg, case_sensitive):
-		''' Parse a rule argument. '''
-		arg = arg.strip()
-		match = RuleList.rule_regex.match(arg)
-		if not match:
-			raise HumanReadableError('Invalid rule: expected "<pattern> = <score>", got "{0}".'.format(arg))
-
-		pattern = match.group(1).strip()
-		try:
-			pattern = Pattern(pattern, case_sensitive)
-		except ValueError as e:
-			raise HumanReadableError('Invalid pattern: {0} in "{1}".'.format(e, pattern))
-
-		score   = parse_int(match.group(2), 'score')
-		return (pattern, score)
-
-
-def decode_replacements(blob):
-	''' Decode a replacement list encoded as JSON. '''
-	result = FriendlyList()
-	try:
-		decoded = json.loads(blob)
-	except ValueError:
-		log('Invalid replacement list: expected JSON encoded list of pairs, got "{0}".'.format(blob))
-		return [], 0
-
-	for replacement in decoded:
-		# Replacements must be a (string, string) pair.
-		if len(replacement) != 2:
-			log('Invalid replacement pattern: expected (pattern, replacement), got "{0}". Replacement ignored.'.format(rule))
-			continue
-		result.append(replacement)
-
-	return result
-
-
-def encode_replacements(replacements):
-	''' Encode a list of replacement patterns as JSON. '''
-	return json.dumps(replacements.raw())
-
-
-class Config:
-	''' The autosort configuration. '''
-
-	default_rules = json.dumps([
-		('core', 0),
-		('irc',  2),
-		('*',    1),
-
-		('irc.irc_raw', 0),
-		('irc.server',  1),
-	])
-
-	default_replacements = '[]'
-	default_signals      = 'buffer_opened buffer_merged buffer_unmerged buffer_renamed'
-
-	def __init__(self, filename):
-		''' Initialize the configuration. '''
-
-		self.filename         = filename
-		self.config_file      = weechat.config_new(self.filename, '', '')
-		self.sorting_section  = None
-
-		self.case_sensitive   = False
-		self.group_irc        = True
-		self.rules            = []
-		self.replacements     = []
-		self.signals          = []
-		self.sort_on_config   = True
-
-		self.__case_sensitive = None
-		self.__group_irc      = None
-		self.__rules          = None
-		self.__replacements   = None
-		self.__signals        = None
-		self.__sort_on_config = None
-
-		if not self.config_file:
-			log('Failed to initialize configuration file "{0}".'.format(self.filename))
-			return
-
-		self.sorting_section = weechat.config_new_section(self.config_file, 'sorting', False, False, '', '', '', '', '', '', '', '', '', '')
-
-		if not self.sorting_section:
-			log('Failed to initialize section "sorting" of configuration file.')
-			weechat.config_free(self.config_file)
-			return
-
-		self.__case_sensitive = weechat.config_new_option(
-			self.config_file, self.sorting_section,
-			'case_sensitive', 'boolean',
-			'If this option is on, sorting is case sensitive.',
-			'', 0, 0, 'off', 'off', 0,
-			'', '', '', '', '', ''
-		)
-
-		self.__group_irc = weechat.config_new_option(
-			self.config_file, self.sorting_section,
-			'group_irc', 'boolean',
-			'If this option is on, the script pretends that IRC channel/private buffers are renamed to "irc.server.{network}.{channel}" rather than "irc.{network}.{channel}".' +
-			'This ensures that these buffers are grouped with their respective server buffer.',
-			'', 0, 0, 'on', 'on', 0,
-			'', '', '', '', '', ''
-		)
-
-		self.__rules = weechat.config_new_option(
-			self.config_file, self.sorting_section,
-			'rules', 'string',
-			'An ordered list of sorting rules encoded as JSON. See /help autosort for commands to manipulate these rules.',
-			'', 0, 0, Config.default_rules, Config.default_rules, 0,
-			'', '', '', '', '', ''
-		)
-
-		self.__replacements = weechat.config_new_option(
-			self.config_file, self.sorting_section,
-			'replacements', 'string',
-			'An ordered list of replacement patterns to use on buffer name components, encoded as JSON. See /help autosort for commands to manipulate these replacements.',
-			'', 0, 0, Config.default_replacements, Config.default_replacements, 0,
-			'', '', '', '', '', ''
-		)
-
-		self.__signals = weechat.config_new_option(
-			self.config_file, self.sorting_section,
-			'signals', 'string',
-			'The signals that will cause autosort to resort your buffer list. Seperate signals with spaces.',
-			'', 0, 0, Config.default_signals, Config.default_signals, 0,
-			'', '', '', '', '', ''
-		)
-
-		self.__sort_on_config = weechat.config_new_option(
-			self.config_file, self.sorting_section,
-			'sort_on_config_change', 'boolean',
-			'Decides if the buffer list should be sorted when autosort configuration changes.',
-			'', 0, 0, 'on', 'on', 0,
-			'', '', '', '', '', ''
-		)
-
-		if weechat.config_read(self.config_file) != weechat.WEECHAT_RC_OK:
-			log('Failed to load configuration file.')
-
-		if weechat.config_write(self.config_file) != weechat.WEECHAT_RC_OK:
-			log('Failed to write configuration file.')
-
-		self.reload()
-
-	def reload(self):
-		''' Load configuration variables. '''
-
-		self.case_sensitive = weechat.config_boolean(self.__case_sensitive)
-		self.group_irc      = weechat.config_boolean(self.__group_irc)
-
-		rules_blob          = weechat.config_string(self.__rules)
-		replacements_blob   = weechat.config_string(self.__replacements)
-		signals_blob        = weechat.config_string(self.__signals)
-
-		self.rules          = RuleList.decode(rules_blob, self.case_sensitive)
-		self.replacements   = decode_replacements(replacements_blob)
-		self.signals        = signals_blob.split()
-		self.sort_on_config = weechat.config_boolean(self.__sort_on_config)
-
-	def save_rules(self, run_callback = True):
-		''' Save the current rules to the configuration. '''
-		weechat.config_option_set(self.__rules, RuleList.encode(self.rules), run_callback)
-
-	def save_replacements(self, run_callback = True):
-		''' Save the current replacement patterns to the configuration. '''
-		weechat.config_option_set(self.__replacements, encode_replacements(self.replacements), run_callback)
-
-
-def pad(sequence, length, padding = None):
-	''' Pad a list until is has a certain length. '''
-	return sequence + [padding] * max(0, (length - len(sequence)))
-
-
-def log(message, buffer = 'NULL'):
-	weechat.prnt(buffer, 'autosort: {0}'.format(message))
-
-
-def get_buffers():
-	''' Get a list of all the buffers in weechat. '''
-	buffers = []
-
-	buffer_list = weechat.infolist_get('buffer', '', '')
-
-	while weechat.infolist_next(buffer_list):
-		name   = weechat.infolist_string (buffer_list, 'full_name')
-		number = weechat.infolist_integer(buffer_list, 'number')
-
-		# Buffer is merged with one we already have in the list, skip it.
-		if number <= len(buffers):
-			continue
-		buffers.append((name, number - 1))
-
-	weechat.infolist_free(buffer_list)
-	return buffers
-
-
-def preprocess(buffer, config):
-	'''
-	Preprocess a buffers names.
-	'''
-
-	# Make sure the name is a unicode string.
-	# On python3 this is a NOP since the string type is already decoded as UTF-8.
-	if isinstance(buffer, bytes):
-		buffer = buffer.decode('utf-8')
-
-	if not config.case_sensitive:
-		buffer = buffer.lower()
-
-	for replacement in config.replacements:
-		buffer = buffer.replace(replacement[0], replacement[1])
-
-	buffer = buffer.split('.')
-	if config.group_irc and len(buffer) >= 2 and buffer[0] == 'irc' and buffer[1] not in ('server', 'irc_raw'):
-		buffer.insert(1, 'server')
-
-	return buffer
-
-
-def buffer_sort_key(rules):
-	''' Create a sort key function for a buffer list from a rule list. '''
-	def key(buffer):
-		result  = []
-		name    = ''
-		for word in preprocess(buffer[0], config):
-			name += ('.' if name else '') + word
-			result.append((rules.get_score(name), word))
-		return result
-
-	return key
-
-
-def apply_buffer_order(order):
-	''' Sort the buffers in weechat according to the given order. '''
-	indices = list(order)
-	reverse = [0] * len(indices)
-	for i, index in enumerate(indices):
-		reverse[index] = i
-
-	for i in range(len(indices)):
-		wanted = indices[i]
-		if wanted == i: continue
-		# Weechat buffers are 1-indexed, but our indices aren't.
-		weechat.command('', '/buffer swap {0} {1}'.format(i + 1, wanted + 1))
-		indices[reverse[i]] = wanted
-		reverse[wanted]     = reverse[i]
-
-
-def split_args(args, expected, optional = 0):
-	''' Split an argument string in the desired number of arguments. '''
-	split = args.split(' ', expected - 1)
-	if (len(split) < expected):
-		raise HumanReadableError('Expected at least {0} arguments, got {1}.'.format(expected, len(split)))
-	return split[:-1] + pad(split[-1].split(' ', optional), optional + 1, '')
-
-
-def command_sort(buffer, command, args):
-	''' Sort the buffers and print a confirmation. '''
-	on_buffers_changed()
-	log("Finished sorting buffers.", buffer)
-	return weechat.WEECHAT_RC_OK
-
-
-def command_rule_list(buffer, command, args):
-	''' Show the list of sorting rules. '''
-	output = 'Sorting rules:\n'
-	for i, rule in enumerate(config.rules):
-		output += '    {0}: {1} = {2}\n'.format(i, rule[0].pattern, rule[1])
-	if not len(config.rules):
-		output += '    No sorting rules configured.\n'
-	log(output, buffer)
-
-	return weechat.WEECHAT_RC_OK
-
-
-def command_rule_add(buffer, command, args):
-	''' Add a rule to the rule list. '''
-	rule = RuleList.parse_rule(args, config.case_sensitive)
-
-	config.rules.append(rule)
-	config.save_rules()
-	command_rule_list(buffer, command, '')
-
-	return weechat.WEECHAT_RC_OK
-
-
-def command_rule_insert(buffer, command, args):
-	''' Insert a rule at the desired position in the rule list. '''
-	index, rule = split_args(args, 2)
-	index = parse_int(index, 'index')
-	rule  = RuleList.parse_rule(rule, config.case_sensitive)
-
-	config.rules.insert(index, rule)
-	config.save_rules()
-	command_rule_list(buffer, command, '')
-	return weechat.WEECHAT_RC_OK
-
-
-def command_rule_update(buffer, command, args):
-	''' Update a rule in the rule list. '''
-	index, rule = split_args(args, 2)
-	index = parse_int(index, 'index')
-	rule  = RuleList.parse_rule(rule, config.case_sensitive)
-
-	config.rules[index] = rule
-	config.save_rules()
-	command_rule_list(buffer, command, '')
-	return weechat.WEECHAT_RC_OK
-
-
-def command_rule_delete(buffer, command, args):
-	''' Delete a rule from the rule list. '''
-	index = args.strip()
-	index = parse_int(index, 'index')
-
-	config.rules.pop(index)
-	config.save_rules()
-	command_rule_list(buffer, command, '')
-	return weechat.WEECHAT_RC_OK
-
-
-def command_rule_move(buffer, command, args):
-	''' Move a rule to a new position. '''
-	index_a, index_b = split_args(args, 2)
-	index_a = parse_int(index_a, 'index')
-	index_b = parse_int(index_b, 'index')
-
-	config.rules.move(index_a, index_b)
-	config.save_rules()
-	command_rule_list(buffer, command, '')
-	return weechat.WEECHAT_RC_OK
-
-
-def command_rule_swap(buffer, command, args):
-	''' Swap two rules. '''
-	index_a, index_b = split_args(args, 2)
-	index_a = parse_int(index_a, 'index')
-	index_b = parse_int(index_b, 'index')
-
-	config.rules.swap(index_a, index_b)
-	config.save_rules()
-	command_rule_list(buffer, command, '')
-	return weechat.WEECHAT_RC_OK
-
-
-def command_replacement_list(buffer, command, args):
-	''' Show the list of sorting rules. '''
-	output = 'Replacement patterns:\n'
-	for i, pattern in enumerate(config.replacements):
-		output += '    {0}: {1} -> {2}\n'.format(i, pattern[0], pattern[1])
-	if not len(config.replacements):
-		output += '    No replacement patterns configured.'
-	log(output, buffer)
-
-	return weechat.WEECHAT_RC_OK
-
-
-def command_replacement_add(buffer, command, args):
-	''' Add a rule to the rule list. '''
-	pattern, replacement = split_args(args, 1, 1)
-
-	config.replacements.append((pattern, replacement))
-	config.save_replacements()
-	command_replacement_list(buffer, command, '')
-
-	return weechat.WEECHAT_RC_OK
-
-
-def command_replacement_insert(buffer, command, args):
-	''' Insert a rule at the desired position in the rule list. '''
-	index, pattern, replacement = split_args(args, 2, 1)
-	index = parse_int(index, 'index')
-
-	config.replacements.insert(index, (pattern, replacement))
-	config.save_replacements()
-	command_replacement_list(buffer, command, '')
-	return weechat.WEECHAT_RC_OK
-
-
-def command_replacement_update(buffer, command, args):
-	''' Update a rule in the rule list. '''
-	index, pattern, replacement = split_args(args, 2, 1)
-	index = parse_int(index, 'index')
-
-	config.replacements[index] = (pattern, replacement)
-	config.save_replacements()
-	command_replacement_list(buffer, command, '')
-	return weechat.WEECHAT_RC_OK
-
-
-def command_replacement_delete(buffer, command, args):
-	''' Delete a rule from the rule list. '''
-	index = args.strip()
-	index = parse_int(index, 'index')
-
-	config.replacements.pop(index)
-	config.save_replacements()
-	command_replacement_list(buffer, command, '')
-	return weechat.WEECHAT_RC_OK
-
-
-def command_replacement_move(buffer, command, args):
-	''' Move a rule to a new position. '''
-	index_a, index_b = split_args(args, 2)
-	index_a = parse_int(index_a, 'index')
-	index_b = parse_int(index_b, 'index')
-
-	config.replacements.move(index_a, index_b)
-	config.save_replacements()
-	command_replacement_list(buffer, command, '')
-	return weechat.WEECHAT_RC_OK
-
-
-def command_replacement_swap(buffer, command, args):
-	''' Swap two rules. '''
-	index_a, index_b = split_args(args, 2)
-	index_a = parse_int(index_a, 'index')
-	index_b = parse_int(index_b, 'index')
-
-	config.replacements.swap(index_a, index_b)
-	config.save_replacements()
-	command_replacement_list(buffer, command, '')
-	return weechat.WEECHAT_RC_OK
-
-
-
-
-def call_command(buffer, command, args, subcommands):
-	''' Call a subccommand from a dictionary. '''
-	subcommand, tail = pad(args.split(' ', 1), 2, '')
-	subcommand = subcommand.strip()
-	if (subcommand == ''):
-		child   = subcommands.get(' ')
-	else:
-		command = command + [subcommand]
-		child   = subcommands.get(subcommand)
-
-	if isinstance(child, dict):
-		return call_command(buffer, command, tail, child)
-	elif callable(child):
-		return child(buffer, command, tail)
-
-	log('{0}: command not found'.format(' '.join(command)))
-	return weechat.WEECHAT_RC_ERROR
-
-
-def on_buffers_changed(*args, **kwargs):
-	''' Called whenever the buffer list changes. '''
-	buffers = get_buffers()
-	buffers.sort(key=buffer_sort_key(config.rules))
-	apply_buffer_order([i for _, i in buffers])
-	return weechat.WEECHAT_RC_OK
-
-
-def on_config_changed(*args, **kwargs):
-	''' Called whenever the configuration changes. '''
-	config.reload()
-
-	# Unhook all signals and hook the new ones.
-	for hook in hooks:
-		weechat.unhook(hook)
-	for signal in config.signals:
-		hooks.append(weechat.hook_signal(signal, 'on_buffers_changed', ''))
-
-	if config.sort_on_config:
-		on_buffers_changed()
-
-	return weechat.WEECHAT_RC_OK
-
-
-def on_autosort_command(data, buffer, args):
-	''' Called when the autosort command is invoked. '''
-	try:
-		return call_command(buffer, ['/autosort'], args, {
-			' ':      command_sort,
-			'sort':   command_sort,
-
-			'rules': {
-				' ':         command_rule_list,
-				'list':      command_rule_list,
-				'add':       command_rule_add,
-				'insert':    command_rule_insert,
-				'update':    command_rule_update,
-				'delete':    command_rule_delete,
-				'move':      command_rule_move,
-				'swap':      command_rule_swap,
-			},
-			'replacements': {
-				' ':      command_replacement_list,
-				'list':   command_replacement_list,
-				'add':    command_replacement_add,
-				'insert': command_replacement_insert,
-				'update': command_replacement_update,
-				'delete': command_replacement_delete,
-				'move':   command_replacement_move,
-				'swap':   command_replacement_swap,
-			},
-			'sort':   on_buffers_changed,
-		})
-	except HumanReadableError as e:
-		log(e, buffer)
-		return weechat.WEECHAT_RC_ERROR
-
-
-command_description = r'''
-NOTE: For the best effect, you may want to consider setting the option irc.look.server_buffer to independent and buffers.look.indenting to on.
-
-# Commands
-
-## Miscellaneous
-/autosort sort
-Manually trigger the buffer sorting.
-
-
-## Sorting rules
-
-/autosort rules list
-Print the list of sort rules.
-
-/autosort rules add <pattern> = <score>
-Add a new rule at the end of the list.
-
-/autosort rules insert <index> <pattern> = <score>
-Insert a new rule at the given index in the list.
-
-/autosort rules update <index> <pattern> = <score>
-Update a rule in the list with a new pattern and score.
-
-/autosort rules delete <index>
-Delete a rule from the list.
-
-/autosort rules move <index_from> <index_to>
-Move a rule from one position in the list to another.
-
-/autosort rules swap <index_a> <index_b>
-Swap two rules in the list
-
-
-## Replacement patterns
-
-/autosort replacements list
-Print the list of replacement patterns.
-
-/autosort replacements add <pattern> <replacement>
-Add a new replacement pattern at the end of the list.
-
-/autosort replacements insert <index> <pattern> <replacement>
-Insert a new replacement pattern at the given index in the list.
-
-/autosort replacements update <index> <pattern> <replacement>
-Update a replacement pattern in the list.
-
-/autosort replacements delete <index>
-Delete a replacement pattern from the list.
-
-/autosort replacements move <index_from> <index_to>
-Move a replacement pattern from one position in the list to another.
-
-/autosort replacements swap <index_a> <index_b>
-Swap two replacement pattern in the list
-
-
-# Introduction
-Autosort is a weechat script to automatically keep your buffers sorted.
-The sort order can be customized by defining your own sort rules,
-but the default should be sane enough for most people.
-It can also group IRC channel/private buffers under their server buffer if you like.
-
-Autosort first turns buffer names into a list of their components by splitting on them on the period character.
-For example, the buffer name "irc.server.freenode" is turned into ['irc', 'server', 'freenode'].
-The list of buffers is then lexicographically sorted.
-
-To facilitate custom sort orders, it is possible to assign a score to each component individually before the sorting is done.
-Any name component that did not get a score assigned will be sorted after those that did receive a score.
-Components are always sorted on their score first and on their name second.
-Lower scores are sorted first.
-
-## Automatic or manual sorting
-By default, autosort will automatically sort your buffer list whenever a buffer is opened, merged, unmerged or renamed.
-This should keep your buffers sorted in almost all situations.
-However, you may wish to change the list of signals that cause your buffer list to be sorted.
-Simply edit the "autosort.sorting.signals" option to add or remove any signal you like.
-If you remove all signals you can still sort your buffers manually with the "/autosort sort" command.
-To prevent all automatic sorting, "autosort.sorting.sort_on_config_change" should also be set to off.
-
-## Grouping IRC buffers
-In weechat, IRC channel/private buffers are named "irc.<network>.<#channel>",
-and IRC server buffers are named "irc.server.<network>".
-This does not work very well with lexicographical sorting if you want all buffers for one network grouped together.
-That is why autosort comes with the "autosort.sorting.group_irc" option,
-which secretly pretends IRC channel/private buffers are called "irc.server.<network>.<#channel>".
-The buffers are not actually renamed, autosort simply pretends they are for sorting purposes.
-
-## Replacement patterns
-Sometimes you may want to ignore some characters for sorting purposes.
-On Freenode for example, you may wish to ignore the difference between channels starting with a double or a single hash sign.
-To do so, simply add a replacement pattern that replaces ## with # with the following command:
-/autosort replacements add ## #
-
-Replacement patterns do not support wildcards or special characters at the moment.
-
-## Sort rules
-You can assign scores to name components by defining sort rules.
-The first rule that matches a component decides the score.
-Further rules are not examined.
-Sort rules use the following syntax:
-<glob-pattern> = <score>
-
-You can use the "/autosort rules" command to show and manipulate the list of sort rules.
-
-
-Allowed special characters in the glob patterns are:
-
-Pattern | Meaning
---------|--------
-*       | Matches a sequence of any characters except for periods.
-?       | Matches a single character, but not a period.
-[a-z]   | Matches a single character in the given regex-like character class.
-[^ab]   | A negated regex-like character class.
-\*      | A backslash escapes the next characters and removes its special meaning.
-\\      | A literal backslash.
-
-
-## Example
-As an example, consider the following rule list:
-0: core            = 0
-1: irc             = 2
-2: *               = 1
-
-3: irc.server.*.#* = 1
-4: irc.server.*.*  = 0
-
-Rule 0 ensures the core buffer is always sorted first.
-Rule 1 sorts IRC buffers last and rule 2 puts all remaining buffers in between the two.
-
-Rule 3 and 4 would make no sense with the group_irc option off.
-With the option on though, these rules will sort private buffers before regular channel buffers.
-Rule 3 matches channel buffers and assigns them a higher score,
-while rule 4 matches the buffers that remain and assigns them a lower score.
-The same effect could also be achieved with a single rule:
-irc.server.*.[^#]* = 0
-'''
-
-command_completion = 'sort||rules list|add|insert|update|delete|move|swap||replacements list|add|insert|update|delete|move|swap'
-
-
-if weechat.register(SCRIPT_NAME, SCRIPT_AUTHOR, SCRIPT_VERSION, SCRIPT_LICENSE, SCRIPT_DESC, "", ""):
-	config = Config('autosort')
-
-	weechat.hook_config('autosort.*',      'on_config_changed',  '')
-	weechat.hook_command('autosort', command_description, '', '', command_completion, 'on_autosort_command', 'NULL')
-	on_config_changed()
diff --git a/.weechat/python/colorize_nicks.py b/.weechat/python/colorize_nicks.py
deleted file mode 100644
index 1460f013..00000000
--- a/.weechat/python/colorize_nicks.py
+++ /dev/null
@@ -1,355 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright (c) 2010 by xt <xt@bash.no>
-#
-# 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 <http://www.gnu.org/licenses/>.
-#
-
-# This script colors nicks in IRC channels in the actual message
-# not just in the prefix section.
-#
-#
-# History:
-# 2017-03-01, arza <arza@arza.us>
-#   version 23: don't colorize nicklist group names
-# 2016-05-01, Simmo Saan <simmo.saan@gmail.com>
-#   version 22: invalidate cached colors on hash algorithm change
-# 2015-07-28, xt
-#   version 21: fix problems with nicks with commas in them
-# 2015-04-19, xt
-#   version 20: fix ignore of nicks in URLs
-# 2015-04-18, xt
-#   version 19: new option ignore nicks in URLs
-# 2015-03-03, xt
-#   version 18: iterate buffers looking for nicklists instead of servers
-# 2015-02-23, holomorph
-#   version 17: fix coloring in non-channel buffers (#58)
-# 2014-09-17, holomorph
-#   version 16: use weechat config facilities
-#               clean unused, minor linting, some simplification
-# 2014-05-05, holomorph
-#   version 15: fix python2-specific re.search check
-# 2013-01-29, nils_2
-#   version 14: make script compatible with Python 3.x
-# 2012-10-19, ldvx
-#   version 13: Iterate over every word to prevent incorrect colorization of
-#               nicks. Added option greedy_matching.
-# 2012-04-28, ldvx
-#   version 12: added ignore_tags to avoid colorizing nicks if tags are present
-# 2012-01-14, nesthib
-#   version 11: input_text_display hook and modifier to colorize nicks in input bar
-# 2010-12-22, xt
-#   version 10: hook config option for updating blacklist
-# 2010-12-20, xt
-#   version 0.9: hook new config option for weechat 0.3.4
-# 2010-11-01, nils_2
-#   version 0.8: hook_modifier() added to communicate with rainbow_text
-# 2010-10-01, xt
-#   version 0.7: changes to support non-irc-plugins
-# 2010-07-29, xt
-#   version 0.6: compile regexp as per patch from Chris quigybo@hotmail.com
-# 2010-07-19, xt
-#   version 0.5: fix bug with incorrect coloring of own nick
-# 2010-06-02, xt
-#   version 0.4: update to reflect API changes
-# 2010-03-26, xt
-#   version 0.3: fix error with exception
-# 2010-03-24, xt
-#   version 0.2: use ignore_channels when populating to increase performance.
-# 2010-02-03, xt
-#   version 0.1: initial (based on ruby script by dominikh)
-#
-# Known issues: nicks will not get colorized if they begin with a character
-# such as ~ (which some irc networks do happen to accept)
-
-import weechat
-import re
-w = weechat
-
-SCRIPT_NAME    = "colorize_nicks"
-SCRIPT_AUTHOR  = "xt <xt@bash.no>"
-SCRIPT_VERSION = "23"
-SCRIPT_LICENSE = "GPL"
-SCRIPT_DESC    = "Use the weechat nick colors in the chat area"
-
-VALID_NICK = r'([@~&!%+])?([-a-zA-Z0-9\[\]\\`_^\{|\}]+)'
-valid_nick_re = re.compile(VALID_NICK)
-ignore_channels = []
-ignore_nicks = []
-
-# Dict with every nick on every channel with its color as lookup value
-colored_nicks = {}
-
-CONFIG_FILE_NAME = "colorize_nicks"
-
-# config file and options
-colorize_config_file = ""
-colorize_config_option = {}
-
-def colorize_config_init():
-    '''
-    Initialization of configuration file.
-    Sections: look.
-    '''
-    global colorize_config_file, colorize_config_option
-    colorize_config_file = weechat.config_new(CONFIG_FILE_NAME,
-                                              "colorize_config_reload_cb", "")
-    if colorize_config_file == "":
-        return
-
-    # section "look"
-    section_look = weechat.config_new_section(
-        colorize_config_file, "look", 0, 0, "", "", "", "", "", "", "", "", "", "")
-    if section_look == "":
-        weechat.config_free(colorize_config_file)
-        return
-    colorize_config_option["blacklist_channels"] = weechat.config_new_option(
-        colorize_config_file, section_look, "blacklist_channels",
-        "string", "Comma separated list of channels", "", 0, 0,
-        "", "", 0, "", "", "", "", "", "")
-    colorize_config_option["blacklist_nicks"] = weechat.config_new_option(
-        colorize_config_file, section_look, "blacklist_nicks",
-        "string", "Comma separated list of nicks", "", 0, 0,
-        "so,root", "so,root", 0, "", "", "", "", "", "")
-    colorize_config_option["min_nick_length"] = weechat.config_new_option(
-        colorize_config_file, section_look, "min_nick_length",
-        "integer", "Minimum length nick to colorize", "",
-        2, 20, "", "", 0, "", "", "", "", "", "")
-    colorize_config_option["colorize_input"] = weechat.config_new_option(
-        colorize_config_file, section_look, "colorize_input",
-        "boolean", "Whether to colorize input", "", 0,
-        0, "off", "off", 0, "", "", "", "", "", "")
-    colorize_config_option["ignore_tags"] = weechat.config_new_option(
-        colorize_config_file, section_look, "ignore_tags",
-        "string", "Comma separated list of tags to ignore; i.e. irc_join,irc_part,irc_quit", "", 0, 0,
-        "", "", 0, "", "", "", "", "", "")
-    colorize_config_option["greedy_matching"] = weechat.config_new_option(
-        colorize_config_file, section_look, "greedy_matching",
-        "boolean", "If off, then use lazy matching instead", "", 0,
-        0, "on", "on", 0, "", "", "", "", "", "")
-    colorize_config_option["ignore_nicks_in_urls"] = weechat.config_new_option(
-        colorize_config_file, section_look, "ignore_nicks_in_urls",
-        "boolean", "If on, don't colorize nicks inside URLs", "", 0,
-        0, "off", "off", 0, "", "", "", "", "", "")
-
-def colorize_config_read():
-    ''' Read configuration file. '''
-    global colorize_config_file
-    return weechat.config_read(colorize_config_file)
-
-def colorize_nick_color(nick, my_nick):
-    ''' Retrieve nick color from weechat. '''
-    if nick == my_nick:
-        return w.color(w.config_string(w.config_get('weechat.color.chat_nick_self')))
-    else:
-        return w.info_get('irc_nick_color', nick)
-
-def colorize_cb(data, modifier, modifier_data, line):
-    ''' Callback that does the colorizing, and returns new line if changed '''
-
-    global ignore_nicks, ignore_channels, colored_nicks
-
-
-    full_name = modifier_data.split(';')[1]
-    channel = '.'.join(full_name.split('.')[1:])
-
-    buffer = w.buffer_search('', full_name)
-    # Check if buffer has colorized nicks
-    if buffer not in colored_nicks:
-        return line
-
-    if channel and channel in ignore_channels:
-        return line
-
-    min_length = w.config_integer(colorize_config_option['min_nick_length'])
-    reset = w.color('reset')
-
-    # Don't colorize if the ignored tag is present in message
-    tags_line = modifier_data.rsplit(';')
-    if len(tags_line) >= 3:
-        tags_line = tags_line[2].split(',')
-        for i in w.config_string(colorize_config_option['ignore_tags']).split(','):
-            if i in tags_line:
-                return line
-
-    for words in valid_nick_re.findall(line):
-        nick = words[1]
-        # Check that nick is not ignored and longer than minimum length
-        if len(nick) < min_length or nick in ignore_nicks:
-            continue
-
-        # Check that nick is in the dictionary colored_nicks
-        if nick in colored_nicks[buffer]:
-            nick_color = colored_nicks[buffer][nick]
-
-            # Let's use greedy matching. Will check against every word in a line.
-            if w.config_boolean(colorize_config_option['greedy_matching']):
-                for word in line.split():
-                    if w.config_boolean(colorize_config_option['ignore_nicks_in_urls']) and \
-                          word.startswith(('http://', 'https://')):
-                        continue
-
-                    if nick in word:
-                        # Is there a nick that contains nick and has a greater lenght?
-                        # If so let's save that nick into var biggest_nick
-                        biggest_nick = ""
-                        for i in colored_nicks[buffer]:
-                            if nick in i and nick != i and len(i) > len(nick):
-                                if i in word:
-                                    # If a nick with greater len is found, and that word
-                                    # also happens to be in word, then let's save this nick
-                                    biggest_nick = i
-                        # If there's a nick with greater len, then let's skip this
-                        # As we will have the chance to colorize when biggest_nick
-                        # iterates being nick.
-                        if len(biggest_nick) > 0 and biggest_nick in word:
-                            pass
-                        elif len(word) < len(biggest_nick) or len(biggest_nick) == 0:
-                            new_word = word.replace(nick, '%s%s%s' % (nick_color, nick, reset))
-                            line = line.replace(word, new_word)
-            # Let's use lazy matching for nick
-            else:
-                nick_color = colored_nicks[buffer][nick]
-                # The two .? are in case somebody writes "nick:", "nick,", etc
-                # to address somebody
-                regex = r"(\A|\s).?(%s).?(\Z|\s)" % re.escape(nick)
-                match = re.search(regex, line)
-                if match is not None:
-                    new_line = line[:match.start(2)] + nick_color+nick+reset + line[match.end(2):]
-                    line = new_line
-    return line
-
-def colorize_input_cb(data, modifier, modifier_data, line):
-    ''' Callback that does the colorizing in input '''
-
-    global ignore_nicks, ignore_channels, colored_nicks
-
-    min_length = w.config_integer(colorize_config_option['min_nick_length'])
-
-    if not w.config_boolean(colorize_config_option['colorize_input']):
-        return line
-
-    buffer = w.current_buffer()
-    # Check if buffer has colorized nicks
-    if buffer not in colored_nicks:
-        return line
-
-    channel = w.buffer_get_string(buffer, 'name')
-    if channel and channel in ignore_channels:
-        return line
-
-    reset = w.color('reset')
-
-    for words in valid_nick_re.findall(line):
-        nick = words[1]
-        # Check that nick is not ignored and longer than minimum length
-        if len(nick) < min_length or nick in ignore_nicks:
-            continue
-        if nick in colored_nicks[buffer]:
-            nick_color = colored_nicks[buffer][nick]
-            line = line.replace(nick, '%s%s%s' % (nick_color, nick, reset))
-
-    return line
-
-def populate_nicks(*args):
-    ''' Fills entire dict with all nicks weechat can see and what color it has
-    assigned to it. '''
-    global colored_nicks
-
-    colored_nicks = {}
-
-    buffers = w.infolist_get('buffer', '', '')
-    while w.infolist_next(buffers):
-        buffer_ptr = w.infolist_pointer(buffers, 'pointer')
-        my_nick = w.buffer_get_string(buffer_ptr, 'localvar_nick')
-        nicklist = w.infolist_get('nicklist', buffer_ptr, '')
-        while w.infolist_next(nicklist):
-            if buffer_ptr not in colored_nicks:
-                colored_nicks[buffer_ptr] = {}
-
-            if w.infolist_string(nicklist, 'type') != 'nick':
-                continue
-
-            nick = w.infolist_string(nicklist, 'name')
-            nick_color = colorize_nick_color(nick, my_nick)
-
-            colored_nicks[buffer_ptr][nick] = nick_color
-
-        w.infolist_free(nicklist)
-
-    w.infolist_free(buffers)
-
-    return w.WEECHAT_RC_OK
-
-def add_nick(data, signal, type_data):
-    ''' Add nick to dict of colored nicks '''
-    global colored_nicks
-
-    # Nicks can have , in them in some protocols
-    splitted = type_data.split(',')
-    pointer = splitted[0]
-    nick = ",".join(splitted[1:])
-    if pointer not in colored_nicks:
-        colored_nicks[pointer] = {}
-
-    my_nick = w.buffer_get_string(pointer, 'localvar_nick')
-    nick_color = colorize_nick_color(nick, my_nick)
-
-    colored_nicks[pointer][nick] = nick_color
-
-    return w.WEECHAT_RC_OK
-
-def remove_nick(data, signal, type_data):
-    ''' Remove nick from dict with colored nicks '''
-    global colored_nicks
-
-    # Nicks can have , in them in some protocols
-    splitted = type_data.split(',')
-    pointer = splitted[0]
-    nick = ",".join(splitted[1:])
-
-    if pointer in colored_nicks and nick in colored_nicks[pointer]:
-        del colored_nicks[pointer][nick]
-
-    return w.WEECHAT_RC_OK
-
-def update_blacklist(*args):
-    ''' Set the blacklist for channels and nicks. '''
-    global ignore_channels, ignore_nicks
-    ignore_channels = w.config_string(colorize_config_option['blacklist_channels']).split(',')
-    ignore_nicks = w.config_string(colorize_config_option['blacklist_nicks']).split(',')
-    return w.WEECHAT_RC_OK
-
-if __name__ == "__main__":
-    if w.register(SCRIPT_NAME, SCRIPT_AUTHOR, SCRIPT_VERSION, SCRIPT_LICENSE,
-                  SCRIPT_DESC, "", ""):
-        colorize_config_init()
-        colorize_config_read()
-
-        # Run once to get data ready
-        update_blacklist()
-        populate_nicks()
-
-        w.hook_signal('nicklist_nick_added', 'add_nick', '')
-        w.hook_signal('nicklist_nick_removed', 'remove_nick', '')
-        w.hook_modifier('weechat_print', 'colorize_cb', '')
-        # Hook config for changing colors
-        w.hook_config('weechat.color.chat_nick_colors', 'populate_nicks', '')
-        w.hook_config('weechat.look.nick_color_hash', 'populate_nicks', '')
-        # Hook for working togheter with other scripts (like colorize_lines)
-        w.hook_modifier('colorize_nicks', 'colorize_cb', '')
-        # Hook for modifying input
-        w.hook_modifier('250|input_text_display', 'colorize_input_cb', '')
-        # Hook for updating blacklist (this could be improved to use fnmatch)
-        weechat.hook_config('%s.look.blacklist*' % SCRIPT_NAME, 'update_blacklist', '')
diff --git a/.weechat/python/go.py b/.weechat/python/go.py
deleted file mode 100644
index a30f58f0..00000000
--- a/.weechat/python/go.py
+++ /dev/null
@@ -1,561 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright (C) 2009-2014 Sébastien Helleu <flashcode@flashtux.org>
-# Copyright (C) 2010 m4v <lambdae2@gmail.com>
-# Copyright (C) 2011 stfn <stfnmd@googlemail.com>
-#
-# 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 <http://www.gnu.org/licenses/>.
-#
-
-#
-# History:
-#
-# 2017-04-01, Sébastien Helleu <flashcode@flashtux.org>:
-#     version 2.5: add option "buffer_number"
-# 2017-03-02, Sébastien Helleu <flashcode@flashtux.org>:
-#     version 2.4: fix syntax and indentation error
-# 2017-02-25, Simmo Saan <simmo.saan@gmail.com>
-#     version 2.3: fix fuzzy search breaking buffer number search display
-# 2016-01-28, ylambda <ylambda@koalabeast.com>
-#     version 2.2: add option "fuzzy_search"
-# 2015-11-12, nils_2 <weechatter@arcor.de>
-#     version 2.1: fix problem with buffer short_name "weechat", using option
-#                  "use_core_instead_weechat", see:
-#                  https://github.com/weechat/weechat/issues/574
-# 2014-05-12, Sébastien Helleu <flashcode@flashtux.org>:
-#     version 2.0: add help on options, replace option "sort_by_activity" by
-#                  "sort" (add sort by name and first match at beginning of
-#                  name and by number), PEP8 compliance
-# 2012-11-26, Nei <anti.teamidiot.de>
-#     version 1.9: add auto_jump option to automatically go to buffer when it
-#                  is uniquely selected
-# 2012-09-17, Sébastien Helleu <flashcode@flashtux.org>:
-#     version 1.8: fix jump to non-active merged buffers (jump with buffer name
-#                  instead of number)
-# 2012-01-03 nils_2 <weechatter@arcor.de>
-#     version 1.7: add option "use_core_instead_weechat"
-# 2012-01-03, Sébastien Helleu <flashcode@flashtux.org>:
-#     version 1.6: make script compatible with Python 3.x
-# 2011-08-24, stfn <stfnmd@googlemail.com>:
-#     version 1.5: /go with name argument jumps directly to buffer
-#                  Remember cursor position in buffer input
-# 2011-05-31, Elián Hanisch <lambdae2@gmail.com>:
-#     version 1.4: Sort list of buffers by activity.
-# 2011-04-25, Sébastien Helleu <flashcode@flashtux.org>:
-#     version 1.3: add info "go_running" (used by script input_lock.rb)
-# 2010-11-01, Sébastien Helleu <flashcode@flashtux.org>:
-#     version 1.2: use high priority for hooks to prevent conflict with other
-#                  plugins/scripts (WeeChat >= 0.3.4 only)
-# 2010-03-25, Elián Hanisch <lambdae2@gmail.com>:
-#     version 1.1: use a space to match the end of a string
-# 2009-11-16, Sébastien Helleu <flashcode@flashtux.org>:
-#     version 1.0: add new option to display short names
-# 2009-06-15, Sébastien Helleu <flashcode@flashtux.org>:
-#     version 0.9: fix typo in /help go with command /key
-# 2009-05-16, Sébastien Helleu <flashcode@flashtux.org>:
-#     version 0.8: search buffer by number, fix bug when window is split
-# 2009-05-03, Sébastien Helleu <flashcode@flashtux.org>:
-#     version 0.7: eat tab key (do not complete input, just move buffer
-#                  pointer)
-# 2009-05-02, Sébastien Helleu <flashcode@flashtux.org>:
-#     version 0.6: sync with last API changes
-# 2009-03-22, Sébastien Helleu <flashcode@flashtux.org>:
-#     version 0.5: update modifier signal name for input text display,
-#                  fix arguments for function string_remove_color
-# 2009-02-18, Sébastien Helleu <flashcode@flashtux.org>:
-#     version 0.4: do not hook command and init options if register failed
-# 2009-02-08, Sébastien Helleu <flashcode@flashtux.org>:
-#     version 0.3: case insensitive search for buffers names
-# 2009-02-08, Sébastien Helleu <flashcode@flashtux.org>:
-#     version 0.2: add help about Tab key
-# 2009-02-08, Sébastien Helleu <flashcode@flashtux.org>:
-#     version 0.1: initial release
-#
-
-"""
-Quick jump to buffers.
-(this script requires WeeChat 0.3.0 or newer)
-"""
-
-from __future__ import print_function
-
-SCRIPT_NAME = 'go'
-SCRIPT_AUTHOR = 'Sébastien Helleu <flashcode@flashtux.org>'
-SCRIPT_VERSION = '2.5'
-SCRIPT_LICENSE = 'GPL3'
-SCRIPT_DESC = 'Quick jump to buffers'
-
-SCRIPT_COMMAND = 'go'
-
-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
-
-import re
-
-# script options
-SETTINGS = {
-    'color_number': (
-        'yellow,magenta',
-        'color for buffer number (not selected)'),
-    'color_number_selected': (
-        'yellow,red',
-        'color for selected buffer number'),
-    'color_name': (
-        'black,cyan',
-        'color for buffer name (not selected)'),
-    'color_name_selected': (
-        'black,brown',
-        'color for a selected buffer name'),
-    'color_name_highlight': (
-        'red,cyan',
-        'color for highlight in buffer name (not selected)'),
-    'color_name_highlight_selected': (
-        'red,brown',
-        'color for highlight in a selected buffer name'),
-    'message': (
-        'Go to: ',
-        'message to display before list of buffers'),
-    'short_name': (
-        'off',
-        'display and search in short names instead of buffer name'),
-    'sort': (
-        'number,beginning',
-        'comma-separated list of keys to sort buffers '
-        '(the order is important, sorts are performed in the given order): '
-        'name = sort by name (or short name), ',
-        'hotlist = sort by hotlist order, '
-        'number = first match a buffer number before digits in name, '
-        'beginning = first match at beginning of names (or short names); '
-        'the default sort of buffers is by numbers'),
-    'use_core_instead_weechat': (
-        'off',
-        'use name "core" instead of "weechat" for core buffer'),
-    'auto_jump': (
-        'off',
-        'automatically jump to buffer when it is uniquely selected'),
-    'fuzzy_search': (
-        'off',
-        'search buffer matches using approximation'),
-    'buffer_number': (
-        'on',
-        'display buffer number'),
-}
-
-# hooks management
-HOOK_COMMAND_RUN = {
-    'input': ('/input *', 'go_command_run_input'),
-    'buffer': ('/buffer *', 'go_command_run_buffer'),
-    'window': ('/window *', 'go_command_run_window'),
-}
-hooks = {}
-
-# input before command /go (we'll restore it later)
-saved_input = ''
-saved_input_pos = 0
-
-# last user input (if changed, we'll update list of matching buffers)
-old_input = None
-
-# matching buffers
-buffers = []
-buffers_pos = 0
-
-
-def go_option_enabled(option):
-    """Checks if a boolean script option is enabled or not."""
-    return weechat.config_string_to_boolean(weechat.config_get_plugin(option))
-
-
-def go_info_running(data, info_name, arguments):
-    """Returns "1" if go is running, otherwise "0"."""
-    return '1' if 'modifier' in hooks else '0'
-
-
-def go_unhook_one(hook):
-    """Unhook something hooked by this script."""
-    global hooks
-    if hook in hooks:
-        weechat.unhook(hooks[hook])
-        del hooks[hook]
-
-
-def go_unhook_all():
-    """Unhook all."""
-    go_unhook_one('modifier')
-    for hook in HOOK_COMMAND_RUN:
-        go_unhook_one(hook)
-
-
-def go_hook_all():
-    """Hook command_run and modifier."""
-    global hooks
-    priority = ''
-    version = weechat.info_get('version_number', '') or 0
-    # use high priority for hook to prevent conflict with other plugins/scripts
-    # (WeeChat >= 0.3.4 only)
-    if int(version) >= 0x00030400:
-        priority = '2000|'
-    for hook, value in HOOK_COMMAND_RUN.items():
-        if hook not in hooks:
-            hooks[hook] = weechat.hook_command_run(
-                '%s%s' % (priority, value[0]),
-                value[1], '')
-    if 'modifier' not in hooks:
-        hooks['modifier'] = weechat.hook_modifier(
-            'input_text_display_with_cursor', 'go_input_modifier', '')
-
-
-def go_start(buf):
-    """Start go on buffer."""
-    global saved_input, saved_input_pos, old_input, buffers_pos
-    go_hook_all()
-    saved_input = weechat.buffer_get_string(buf, 'input')
-    saved_input_pos = weechat.buffer_get_integer(buf, 'input_pos')
-    weechat.buffer_set(buf, 'input', '')
-    old_input = None
-    buffers_pos = 0
-
-
-def go_end(buf):
-    """End go on buffer."""
-    global saved_input, saved_input_pos, old_input
-    go_unhook_all()
-    weechat.buffer_set(buf, 'input', saved_input)
-    weechat.buffer_set(buf, 'input_pos', str(saved_input_pos))
-    old_input = None
-
-
-def go_match_beginning(buf, string):
-    """Check if a string matches the beginning of buffer name/short name."""
-    if not string:
-        return False
-    esc_str = re.escape(string)
-    if re.search(r'^#?' + esc_str, buf['name']) \
-            or re.search(r'^#?' + esc_str, buf['short_name']):
-        return True
-    return False
-
-
-def go_match_fuzzy(name, string):
-    """Check if string matches name using approximation."""
-    if not string:
-        return False
-
-    name_len = len(name)
-    string_len = len(string)
-
-    if string_len > name_len:
-        return False
-    if name_len == string_len:
-        return name == string
-
-    # Attempt to match all chars somewhere in name
-    prev_index = -1
-    for i, char in enumerate(string):
-        index = name.find(char, prev_index+1)
-        if index == -1:
-            return False
-        prev_index = index
-    return True
-
-
-def go_now(buf, args):
-    """Go to buffer specified by args."""
-    listbuf = go_matching_buffers(args)
-    if not listbuf:
-        return
-
-    # prefer buffer that matches at beginning (if option is enabled)
-    if 'beginning' in weechat.config_get_plugin('sort').split(','):
-        for index in range(len(listbuf)):
-            if go_match_beginning(listbuf[index], args):
-                weechat.command(buf,
-                                '/buffer ' + str(listbuf[index]['full_name']))
-                return
-
-    # jump to first buffer in matching buffers by default
-    weechat.command(buf, '/buffer ' + str(listbuf[0]['full_name']))
-
-
-def go_cmd(data, buf, args):
-    """Command "/go": just hook what we need."""
-    global hooks
-    if args:
-        go_now(buf, args)
-    elif 'modifier' in hooks:
-        go_end(buf)
-    else:
-        go_start(buf)
-    return weechat.WEECHAT_RC_OK
-
-
-def go_matching_buffers(strinput):
-    """Return a list with buffers matching user input."""
-    global buffers_pos
-    listbuf = []
-    if len(strinput) == 0:
-        buffers_pos = 0
-    strinput = strinput.lower()
-    infolist = weechat.infolist_get('buffer', '', '')
-    while weechat.infolist_next(infolist):
-        short_name = weechat.infolist_string(infolist, 'short_name')
-        if go_option_enabled('short_name'):
-            name = weechat.infolist_string(infolist, 'short_name')
-        else:
-            name = weechat.infolist_string(infolist, 'name')
-        if name == 'weechat' \
-                and go_option_enabled('use_core_instead_weechat') \
-                and weechat.infolist_string(infolist, 'plugin_name') == 'core':
-            name = 'core'
-        number = weechat.infolist_integer(infolist, 'number')
-        full_name = weechat.infolist_string(infolist, 'full_name')
-        if not full_name:
-            full_name = '%s.%s' % (
-                weechat.infolist_string(infolist, 'plugin_name'),
-                weechat.infolist_string(infolist, 'name'))
-        pointer = weechat.infolist_pointer(infolist, 'pointer')
-        matching = name.lower().find(strinput) >= 0
-        if not matching and strinput[-1] == ' ':
-            matching = name.lower().endswith(strinput.strip())
-        if not matching and go_option_enabled('fuzzy_search'):
-            matching = go_match_fuzzy(name.lower(), strinput)
-        if not matching and strinput.isdigit():
-            matching = str(number).startswith(strinput)
-        if len(strinput) == 0 or matching:
-            listbuf.append({
-                'number': number,
-                'short_name': short_name,
-                'name': name,
-                'full_name': full_name,
-                'pointer': pointer,
-            })
-    weechat.infolist_free(infolist)
-
-    # sort buffers
-    hotlist = []
-    infolist = weechat.infolist_get('hotlist', '', '')
-    while weechat.infolist_next(infolist):
-        hotlist.append(
-            weechat.infolist_pointer(infolist, 'buffer_pointer'))
-    weechat.infolist_free(infolist)
-    last_index_hotlist = len(hotlist)
-
-    def _sort_name(buf):
-        """Sort buffers by name (or short name)."""
-        return buf['name']
-
-    def _sort_hotlist(buf):
-        """Sort buffers by hotlist order."""
-        try:
-            return hotlist.index(buf['pointer'])
-        except ValueError:
-            # not in hotlist, always last.
-            return last_index_hotlist
-
-    def _sort_match_number(buf):
-        """Sort buffers by match on number."""
-        return 0 if str(buf['number']) == strinput else 1
-
-    def _sort_match_beginning(buf):
-        """Sort buffers by match at beginning."""
-        return 0 if go_match_beginning(buf, strinput) else 1
-
-    funcs = {
-        'name': _sort_name,
-        'hotlist': _sort_hotlist,
-        'number': _sort_match_number,
-        'beginning': _sort_match_beginning,
-    }
-
-    for key in weechat.config_get_plugin('sort').split(','):
-        if key in funcs:
-            listbuf = sorted(listbuf, key=funcs[key])
-
-    if not strinput:
-        index = [i for i, buf in enumerate(listbuf)
-                 if buf['pointer'] == weechat.current_buffer()]
-        if index:
-            buffers_pos = index[0]
-
-    return listbuf
-
-
-def go_buffers_to_string(listbuf, pos, strinput):
-    """Return string built with list of buffers found (matching user input)."""
-    string = ''
-    strinput = strinput.lower()
-    for i in range(len(listbuf)):
-        selected = '_selected' if i == pos else ''
-        buffer_name = listbuf[i]['name']
-        index = buffer_name.lower().find(strinput)
-        if index >= 0:
-            index2 = index + len(strinput)
-            name = '%s%s%s%s%s' % (
-                buffer_name[:index],
-                weechat.color(weechat.config_get_plugin(
-                    'color_name_highlight' + selected)),
-                buffer_name[index:index2],
-                weechat.color(weechat.config_get_plugin(
-                    'color_name' + selected)),
-                buffer_name[index2:])
-        elif go_option_enabled("fuzzy_search") and \
-                go_match_fuzzy(buffer_name.lower(), strinput):
-            name = ""
-            prev_index = -1
-            for char in strinput.lower():
-                index = buffer_name.lower().find(char, prev_index+1)
-                if prev_index < 0:
-                    name += buffer_name[:index]
-                    name += weechat.color(weechat.config_get_plugin(
-                        'color_name_highlight' + selected))
-                if prev_index >= 0 and index > prev_index+1:
-                    name += weechat.color(weechat.config_get_plugin(
-                        'color_name' + selected))
-                    name += buffer_name[prev_index+1:index]
-                    name += weechat.color(weechat.config_get_plugin(
-                        'color_name_highlight' + selected))
-                name += buffer_name[index]
-                prev_index = index
-
-            name += weechat.color(weechat.config_get_plugin(
-                'color_name' + selected))
-            name += buffer_name[prev_index+1:]
-        else:
-            name = buffer_name
-        string += ' '
-        if go_option_enabled('buffer_number'):
-            string += '%s%s' % (
-                weechat.color(weechat.config_get_plugin(
-                    'color_number' + selected)),
-                str(listbuf[i]['number']))
-        string += '%s%s%s' % (
-            weechat.color(weechat.config_get_plugin(
-                'color_name' + selected)),
-            name,
-            weechat.color('reset'))
-    return '  ' + string if string else ''
-
-
-def go_input_modifier(data, modifier, modifier_data, string):
-    """This modifier is called when input text item is built by WeeChat.
-
-    This is commonly called after changes in input or cursor move: it builds
-    a new input with prefix ("Go to:"), and suffix (list of buffers found).
-    """
-    global old_input, buffers, buffers_pos
-    if modifier_data != weechat.current_buffer():
-        return ''
-    names = ''
-    new_input = weechat.string_remove_color(string, '')
-    new_input = new_input.lstrip()
-    if old_input is None or new_input != old_input:
-        old_buffers = buffers
-        buffers = go_matching_buffers(new_input)
-        if buffers != old_buffers and len(new_input) > 0:
-            if len(buffers) == 1 and go_option_enabled('auto_jump'):
-                weechat.command(modifier_data, '/wait 1ms /input return')
-            buffers_pos = 0
-        old_input = new_input
-    names = go_buffers_to_string(buffers, buffers_pos, new_input.strip())
-    return weechat.config_get_plugin('message') + string + names
-
-
-def go_command_run_input(data, buf, command):
-    """Function called when a command "/input xxx" is run."""
-    global buffers, buffers_pos
-    if command == '/input search_text' or command.find('/input jump') == 0:
-        # search text or jump to another buffer is forbidden now
-        return weechat.WEECHAT_RC_OK_EAT
-    elif command == '/input complete_next':
-        # choose next buffer in list
-        buffers_pos += 1
-        if buffers_pos >= len(buffers):
-            buffers_pos = 0
-        weechat.hook_signal_send('input_text_changed',
-                                 weechat.WEECHAT_HOOK_SIGNAL_STRING, '')
-        return weechat.WEECHAT_RC_OK_EAT
-    elif command == '/input complete_previous':
-        # choose previous buffer in list
-        buffers_pos -= 1
-        if buffers_pos < 0:
-            buffers_pos = len(buffers) - 1
-        weechat.hook_signal_send('input_text_changed',
-                                 weechat.WEECHAT_HOOK_SIGNAL_STRING, '')
-        return weechat.WEECHAT_RC_OK_EAT
-    elif command == '/input return':
-        # switch to selected buffer (if any)
-        go_end(buf)
-        if len(buffers) > 0:
-            weechat.command(
-                buf, '/buffer ' + str(buffers[buffers_pos]['full_name']))
-        return weechat.WEECHAT_RC_OK_EAT
-    return weechat.WEECHAT_RC_OK
-
-
-def go_command_run_buffer(data, buf, command):
-    """Function called when a command "/buffer xxx" is run."""
-    return weechat.WEECHAT_RC_OK_EAT
-
-
-def go_command_run_window(data, buf, command):
-    """Function called when a command "/window xxx" is run."""
-    return weechat.WEECHAT_RC_OK_EAT
-
-
-def go_unload_script():
-    """Function called when script is unloaded."""
-    go_unhook_all()
-    return weechat.WEECHAT_RC_OK
-
-
-def go_main():
-    """Entry point."""
-    if not weechat.register(SCRIPT_NAME, SCRIPT_AUTHOR, SCRIPT_VERSION,
-                            SCRIPT_LICENSE, SCRIPT_DESC,
-                            'go_unload_script', ''):
-        return
-    weechat.hook_command(
-        SCRIPT_COMMAND,
-        'Quick jump to buffers', '[name]',
-        'name: directly jump to buffer by name (without argument, list is '
-        'displayed)\n\n'
-        'You can bind command to a key, for example:\n'
-        '  /key bind meta-g /go\n\n'
-        'You can use completion key (commonly Tab and shift-Tab) to select '
-        'next/previous buffer in list.',
-        '%(buffers_names)',
-        'go_cmd', '')
-
-    # set default settings
-    version = weechat.info_get('version_number', '') or 0
-    for option, value in SETTINGS.items():
-        if not weechat.config_is_set_plugin(option):
-            weechat.config_set_plugin(option, value[0])
-        if int(version) >= 0x00030500:
-            weechat.config_set_desc_plugin(
-                option, '%s (default: "%s")' % (value[1], value[0]))
-    weechat.hook_info('go_running',
-                      'Return "1" if go is running, otherwise "0"',
-                      '',
-                      'go_info_running', '')
-
-
-if __name__ == "__main__" and IMPORT_OK:
-    go_main()
diff --git a/.weechat/python/urlserver.py b/.weechat/python/urlserver.py
deleted file mode 100644
index f54211ef..00000000
--- a/.weechat/python/urlserver.py
+++ /dev/null
@@ -1,1148 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright (C) 2011-2015 Sébastien Helleu <flashcode@flashtux.org>
-# Copyright (C) 2011 xt <xt@bash.no>
-# Copyright (C) 2012 Filip H.F. "FiXato" Slagter
-#                    <fixato+weechat+urlserver@gmail.com>
-# Copyright (C) 2012 WillyKaze <willykaze@willykaze.org>
-# Copyright (C) 2013 Thomas Kindler <mail_weechat@t-kindler.de>
-# Copyright (C) 2013 Felix Eckhofer <felix@tribut.de>
-#
-# 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 <http://www.gnu.org/licenses/>.
-#
-
-#
-# Shorten URLs with own HTTP server.
-# (this script requires Python >= 2.6)
-#
-# How does it work?
-#
-# 1. The URLs displayed in buffers are shortened and stored in memory (saved in
-#    a file when script is unloaded).
-# 2. URLs shortened can be displayed below messages, in a dedicated buffer, or
-#    as HTML page in your browser.
-# 3. This script embeds an HTTP server, which will redirect shortened URLs
-#    to real URL and display list of all URLs if you browse address without
-#    URL key.
-# 4. It is recommended to customize/protect the HTTP server using script
-#    options (see /help urlserver).
-#
-# List of URLs:
-# - in WeeChat: /urlserver
-# - in browser: http://myhost.org:1234/
-#
-# History:
-#
-# 2017-07-26, Sébastien Helleu <flashcode@flashtux.org>:
-#     v2.2: fix write on socket with python 3.x
-# 2016-11-01, Sébastien Helleu <flashcode@flashtux.org>:
-#     v2.1: add option "msg_filtered"
-# 2016-01-20, Yves Stadler <yves.stadler@gmail.com>:
-#     v2.0: add option "http_open_in_new_page"
-# 2015-05-16, Sébastien Helleu <flashcode@flashtux.org>:
-#     v1.9: add option "http_auth_redirect", fix flake8 warnings
-# 2015-04-14, Sébastien Helleu <flashcode@flashtux.org>:
-#     v1.8: evaluate option "http_auth" (to use secured data)
-# 2013-12-09, WakiMiko
-#     v1.7: use HTTPS for youtube embedding
-# 2013-12-09, Sébastien Helleu <flashcode@flashtux.org>:
-#     v1.6: add reason phrase after HTTP code 302 and empty line at the end
-# 2013-12-05, Sébastien Helleu <flashcode@flashtux.org>:
-#     v1.5: replace HTTP 301 by 302
-# 2013-12-05, Sébastien Helleu <flashcode@flashtux.org>:
-#     v1.4: use HTTP 301 instead of meta for the redirection when
-#           there is no referer in request
-# 2013-11-29, Felix Eckhofer <felix@tribut.de>
-#     v1.3: - make it possible to run reverse proxy in a subdirectory by
-#             generating relative links and using the <base> tag. to use this,
-#             set http_hostname_display to 'domain.tld/subdir'.
-#           - mention favicon explicitly (now works in subdirectories, too).
-#           - update favicon to new weechat logo.
-#           - set meta referrer to never in redirect page, so chrome users'
-#             referrers are hidden, too
-#           - fix http_auth in chrome and other browsers which send header
-#             names in lower case
-# 2013-05-04, Thomas Kindler <mail_weechat@t-kindler.de>
-#     v1.2: added a "http_scheme_display" option. This makes it possible to run
-#           the server behind a reverse proxy with https:// URLs.
-# 2013-03-25, Hermit (@irc.freenode.net):
-#     v1.1: made links relative in the html, so that they can be followed when
-#           accessing the listing remotely using the weechat box's IP directly.
-# 2012-12-12, WillyKaze <willykaze@willykaze.org>:
-#     v1.0: add options "http_time_format", "display_msg_in_url" (works with
-#           relay/irc), "color_in_msg", "separators"
-# 2012-04-18, Filip H.F. "FiXato" Slagter <fixato+weechat+urlserver@gmail.com>:
-#     v0.9: add options "http_autostart", "http_port_display"
-#           "url_min_length" can now be set to -1 to auto-detect minimal url
-#           length; also, if port is 80 now, :80 will no longer be added to the
-#           shortened url.
-# 2012-04-17, Filip H.F. "FiXato" Slagter <fixato+weechat+urlserver@gmail.com>:
-#     v0.8: add more CSS support by adding options "http_fg_color",
-#           "http_css_url" and "http_title", add descriptive classes to most
-#           html elements.
-# 2012-04-11, Sébastien Helleu <flashcode@flashtux.org>:
-#     v0.7: fix truncated HTML page (thanks to xt), fix base64 decoding with
-#           Python 3.x
-# 2012-01-19, Sébastien Helleu <flashcode@flashtux.org>:
-#     v0.6: add option "http_hostname_display"
-# 2012-01-03, Sébastien Helleu <flashcode@flashtux.org>:
-#     v0.5: make script compatible with Python 3.x
-# 2011-10-31, Sébastien Helleu <flashcode@flashtux.org>:
-#     v0.4: add options "http_embed_youtube_size" and "http_bg_color",
-#           add extensions jpeg/bmp/svg for embedded images
-# 2011-10-30, Sébastien Helleu <flashcode@flashtux.org>:
-#     v0.3: escape HTML chars for page with list of URLs, add option
-#           "http_prefix_suffix", disable highlights on urlserver buffer
-# 2011-10-30, Sébastien Helleu <flashcode@flashtux.org>:
-#     v0.2: fix error on loading of file "urlserver_list.txt" when it is empty
-# 2011-10-30, Sébastien Helleu <flashcode@flashtux.org>:
-#     v0.1: initial release
-#
-
-SCRIPT_NAME = 'urlserver'
-SCRIPT_AUTHOR = 'Sébastien Helleu <flashcode@flashtux.org>'
-SCRIPT_VERSION = '2.2'
-SCRIPT_LICENSE = 'GPL3'
-SCRIPT_DESC = 'Shorten URLs with own HTTP server'
-
-SCRIPT_COMMAND = 'urlserver'
-SCRIPT_BUFFER = 'urlserver'
-
-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
-
-try:
-    import ast
-    import base64
-    import cgi
-    import datetime
-    import os
-    import re
-    import socket
-    import string
-    import sys
-except ImportError as message:
-    print('Missing package(s) for %s: %s' % (SCRIPT_NAME, message))
-    import_ok = False
-
-# regex are from urlbar.py, written by xt
-url_octet = r'(?:2(?:[0-4]\d|5[0-5])|1\d\d|\d{1,2})'
-url_ipaddr = r'%s(?:\.%s){3}' % (url_octet, url_octet)
-url_label = r'[0-9a-z][-0-9a-z]*[0-9a-z]?'
-url_domain = r'%s(?:\.%s)*\.[a-z][-0-9a-z]*[a-z]?' % (url_label, url_label)
-
-urlserver = {
-    'socket': None,
-    'hook_fd': None,
-    'regex': re.compile(r'(\w+://(?:%s|%s)(?::\d+)?(?:/[^\])>\s]*)?)' %
-                        (url_domain, url_ipaddr),
-                        re.IGNORECASE),
-    'urls': {},
-    'number': 0,
-    'buffer': '',
-}
-
-# script options
-urlserver_settings_default = {
-    # HTTP server settings
-    'http_autostart': (
-        'on',
-        'start the built-in HTTP server automatically)'),
-    'http_scheme_display': (
-        'http',
-        'display this scheme in shortened URLs'),
-    'http_hostname': (
-        '',
-        'force hostname/IP in bind of socket '
-        '(empty value = auto-detect current hostname)'),
-    'http_hostname_display': (
-        '',
-        'display this hostname in shortened URLs'),
-    'http_port': (
-        '',
-        'force port for listening (empty value = find a random free port)'),
-    'http_port_display': (
-        '',
-        'display this port in shortened URLs. Useful if you forward '
-        'a different external port to the internal port'),
-    'http_allowed_ips': (
-        '',
-        'regex for IPs allowed to use server '
-        '(example: "^(123.45.67.89|192.160.*)$")'),
-    'http_auth': (
-        '',
-        'login and password (format: "login:password") required to access to '
-        'page with list of URLs (note: content is evaluated, see /help eval)'),
-    'http_auth_redirect': (
-        'on',
-        'require the login/password (if option "http_auth" is set) for URLs '
-        'redirections'),
-    'http_url_prefix': (
-        '',
-        'prefix to add in URLs to prevent external people to scan your URLs '
-        '(for example: prefix "xx" will give URL: http://host.com:1234/xx/8)'),
-    'http_bg_color': (
-        '#f4f4f4',
-        'background color for HTML page'),
-    'http_fg_color': (
-        '#000',
-        'foreground color for HTML page'),
-    'http_css_url': (
-        '',
-        'URL of external Cascading Style Sheet to add (BE CAREFUL: the HTTP '
-        'referer will be sent to site hosting CSS file!) (empty value = use '
-        'default embedded CSS)'),
-    'http_embed_image': (
-        'off',
-        'embed images in HTML page (BE CAREFUL: the HTTP referer will be sent '
-        'to site hosting image!)'),
-    'http_embed_youtube': (
-        'off',
-        'embed youtube videos in HTML page (BE CAREFUL: the HTTP referer '
-        'will be sent to youtube!)'),
-    'http_embed_youtube_size': (
-        '480*350',
-        'size for embedded youtube video, format is "xxx*yyy"'),
-    'http_prefix_suffix': (
-        ' ',
-        'suffix displayed between prefix and message in HTML page'),
-    'http_title': (
-        'WeeChat URLs',
-        'title of the HTML page'),
-    'http_time_format': (
-        '%d/%m/%y %H:%M:%S',
-        'time format in the HTML page'),
-    'http_open_in_new_page': (
-        'on',
-        'open links in new pages/tabs'),
-    # message filter settings
-    'msg_ignore_buffers': (
-        'core.weechat,python.grep',
-        'comma-separated list (without spaces) of buffers to ignore '
-        '(full name like "irc.freenode.#weechat")'),
-    'msg_ignore_tags': (
-        'irc_quit,irc_part,notify_none',
-        'comma-separated list (without spaces) of tags (or beginning of tags) '
-        'to ignore (for example, use "notify_none" to ignore self messages or '
-        '"nick_weebot" to ignore messages from nick "weebot")'),
-    'msg_require_tags': (
-        'nick_',
-        'comma-separated list (without spaces) of tags (or beginning of tags) '
-        'required to shorten URLs (for example "nick_" to shorten URLs only '
-        'in messages from other users)'),
-    'msg_ignore_regex': (
-        '',
-        'ignore messages matching this regex'),
-    'msg_ignore_dup_urls': (
-        'off',
-        'ignore duplicated URLs (do not add an URL in list if it is already)'),
-    'msg_filtered': (
-        'off',
-        'shorten URLs in filtered messages (with /filter)'),
-    # display settings
-    'color': (
-        'darkgray',
-        'color for urls displayed after message'),
-    'color_in_msg': (
-        '',
-        'color for urls displayed inside irc message: it is a number '
-        '(irc color) between 00 and 15 (see doc for a list of irc colors)'),
-    'separators': (
-        '[|]',
-        'separators for short url list (string with exactly 3 chars)'),
-    'display_urls': (
-        'on',
-        'display URLs below messages'),
-    'display_urls_in_msg': (
-        'off',
-        'add shorten url next to the original url (only in IRC messages) '
-        '(useful for urlserver behind relay/irc)'),
-    'url_min_length': (
-        '0',
-        'minimum length for an URL to be shortened (0 = shorten all URLs, '
-        '-1 = detect length based on shorten URL)'),
-    'urls_amount': (
-        '100',
-        'number of URLs to keep in memory (and in file when script is not '
-        'loaded)'),
-    'buffer_short_name': (
-        'off',
-        'use buffer short name on dedicated buffer'),
-    'debug': (
-        'off',
-        'print some debug messages'),
-}
-urlserver_settings = {}
-
-
-def base62_encode(number):
-    """Encode a number in base62 (all digits + a-z + A-Z)."""
-    base62chars = string.digits + string.ascii_letters
-    l = []
-    while number > 0:
-        remainder = number % 62
-        number = number // 62
-        l.insert(0, base62chars[remainder])
-    return ''.join(l) or '0'
-
-
-def base62_decode(str_value):
-    """Decode a base62 string (all digits + a-z + A-Z) to a number."""
-    base62chars = string.digits + string.ascii_letters
-    return sum([base62chars.index(char) * (62 ** (len(str_value) - index - 1))
-                for index, char in enumerate(str_value)])
-
-
-def base64_decode(s):
-    if sys.version_info >= (3,):
-        # python 3.x
-        return base64.b64decode(s.encode('utf-8'))
-    else:
-        # python 2.x
-        return base64.b64decode(s)
-
-
-def urlserver_get_base_url():
-    """
-    Return url with port number if != default port for the protocol,
-    including prefix path.
-    """
-    global urlserver_settings
-
-    scheme = urlserver_settings['http_scheme_display']
-    hostname = (urlserver_settings['http_hostname_display'] or
-                urlserver_settings['http_hostname'] or socket.getfqdn())
-
-    # If the built-in HTTP server isn't running, default to port from settings
-    port = urlserver_settings['http_port']
-    if len(urlserver_settings['http_port_display']) > 0:
-        port = urlserver_settings['http_port_display']
-    elif urlserver['socket']:
-        port = urlserver['socket'].getsockname()[1]
-
-    # Don't add :port if the port matches the default port for the protocol
-    prefixed_port = ':%s' % port
-
-    if scheme == "http" and prefixed_port == ':80':
-        prefixed_port = ''
-    elif scheme == "https" and prefixed_port == ':443':
-        prefixed_port = ''
-
-    prefix = ''
-    if urlserver_settings['http_url_prefix']:
-        prefix = '%s/' % urlserver_settings['http_url_prefix']
-
-    return '%s://%s%s/%s' % (scheme, hostname, prefixed_port, prefix)
-
-
-def urlserver_short_url(number, full=True):
-    """Return short URL with number."""
-    return '%s%s' % (urlserver_get_base_url() if full else '',
-                     base62_encode(number))
-
-
-def urlserver_server_reply(conn, code, extra_header, message,
-                           mimetype='text/html'):
-    """Send a HTTP reply to client."""
-    global urlserver_settings
-    if extra_header:
-        extra_header += '\r\n'
-    s = 'HTTP/1.1 %s\r\n' \
-        '%s' \
-        'Content-Type: %s\r\n' \
-        'Content-Length: %d\r\n' \
-        '\r\n' \
-        % (code, extra_header, mimetype, len(message))
-    msg = None
-    if sys.version_info >= (3,):
-        # python 3.x
-        if type(message) is bytes:
-            msg = s.encode('utf-8') + message
-        else:
-            msg = s.encode('utf-8') + message.encode('utf-8')
-    else:
-        # python 2.x
-        msg = s + message
-    if urlserver_settings['debug'] == 'on':
-        weechat.prnt('', 'urlserver: sending %d bytes' % len(msg))
-    conn.sendall(msg)
-
-
-def urlserver_server_reply_auth_required(conn):
-    """Reply a 401 (authorization required)."""
-    urlserver_server_reply(conn,
-                           '401 Authorization required',
-                           'WWW-Authenticate: Basic realm="%s"' % SCRIPT_NAME,
-                           '')
-
-
-def urlserver_server_favicon():
-    """Return favicon for HTML page."""
-    s = ('iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QA/wD/AP+g'
-         'vaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3QUTDCsWY4ZjDAAAAC5p'
-         'VFh0Q29tbWVudAAAAAAAQnkgRmxhc2hDb2RlIC0gaHR0cDovL3dlZWNoYXQub3Jn'
-         'L3IAZSEAAAZJSURBVFjD7ZZdbFTHFcf/M/fueteLP8A2/oSExsVASECCIIgctaIG'
-         'oURVmzyEipJWSYUsFRGliJS3qEkElVqpapWHSrxEqVopbaVGrRKJtiRYlps6ttMH'
-         'YmwIKcaO7cXE3vXdj/s1M+f04e6u1vVWfaxUMVejO/fO3HN+5z/nzgxwv9wv/+Mi'
-         '/lPHxq3NyM6tlh9jR14/3BBvqqsPApXwC2FMhdoOfRVTobZVoONambhIWgm2kSBb'
-         'JEgiYQQljOCEBie14IQB1Wk2CcWc1NrkeMJ53a7l/Ge513C28RUAwJMXjz7X0rvp'
-         '64iL3UZwtwE3GCKhmKDBMEzQTFBM0MZAkUFoTNQuV4ruoSGw0SAi0Gf522Yy/8ua'
-         'AGcbX0HnrvYtT7068KdUZ8MeRUboslEiKDKAiSoTIAxDcCSngICEKF2otMrPEgKC'
-         'mJEORuHohZoAOwd6O77y/ccvN3Y37Aq1gRSAEACEgJRlBxJSMKQBJDiqzBBEADOE'
-         'YUAzQxFBE7M2kUTakPB1wNP59wH4NQEOfXvfWy1bN+5SWlfYpRCwbIniF66Xnly6'
-         'ExTDTBgoX4Xa1b52w0AXla9dY8gjIp+YfGPYq7p7ZMjXRD75xqebxSkAvA7g0Il9'
-         'Rx7Y23204lwKCI7EzN7OLP7x9Ls/Va76PYAMIKgOD1Hnw49x994D6Orfh9+dfUIL'
-         'EeX20xcvx1Tg2ssz16xceibu5u4lQi+fAtHMIj7UALAO4OCze85YlgTBAkkBJgCC'
-         'QSCMX5p4W7nq0gu/mQvSkyPnN7R2dwkh6yFkSgiZElI0Pnb8/M8B/AFATNrx0aZN'
-         'HX3NXb110rJsacUhpMBvf9D/DIB31gE8de5wnQnNB3/71YTt5nzXzft5z/FzRcdz'
-         'jDLu3Nj8+wDcyxe+9cjRc29esOJJAFz53s+tBOnp0U4AOPTd1x5vbN+6U1qxZOWf'
-         'lxbmrw3Nupm7d8rv1gD8+Y1JowN1KdXW8NaW3f1o375DdGxvlU1dPfLXg7vvlcft'
-         'GDj5op1IgcmsUa+wspBe+GR4BADaHto7IKSVXKsvY+aj9/4OYLImwFdPX/xR+5f3'
-         '9QMiLgTqAZGEEPWh61iJDRuf9QvZEQCpzp0HT0ZzU7WiCYH01Og4gNknTv0kUZdq'
-         'OiaFBa5SyM3e83JLsx8AULUAmtu27TmfbGyxmbnKsMTSzbFbKiiGAHDwuVdPJBra'
-         'EmSoHBQYABNh7O0LfwGwOvePob6eR5/cH3gGoFI/MzKfz99NT304Ug1eAdjzjZdO'
-         '1Td32TpQiPwzmAAixYuTYx8bFU4BkG1f6j/u5TRADOaSd2EjPTV0C4xxAGjvGxg0'
-         'KgXl6SpAxuL18XEA87UAxJZHnz5dzAQgKiMDzEDoOv78J0NXABR3HTu3Hdz8iJdV'
-         '4HL0xJCWxLX3fnEVwA0AaNi8/3tuJgQxlcZECkxfeeOvAArrAHr7Tx2RsY5ud1VV'
-         'OWcwS6zMTc866U8/AsB1iS0HQy+2Wfk6UokAFgLFzI1cdn5yCEDw4P7BZ0CtjcVV'
-         'VVIJgLCwujBxR3nO2JrfpgQgWx742jd9R9tcFTkzQ4gYbg1fGgIwGw3fdDIoSBAZ'
-         'gLmUhwJLn45OM6lhAGjqPPIdd1WBKepnMAQkZj9+cxjAzX9fd+xtB15qJtN82HMM'
-         'eE30Atpf0sszw1cB5AF0W7FtA5HxaBwRQMbVy7evjgGwW7YdP2Z06wE3G+URU5QA'
-         'oX83WF0YvgIgWAcQuuFuUo19nlOKqgqAqd7e3Du4HyK2ktzw4POhmwKTrkTGBDBZ'
-         'dkffj8907oifYQZUkRCyiRQoTWNheeIWg0dq7Tu2tHqOhm4CZHQl88v0zMCmnlMv'
-         'M9PLTICbDSqZXz0GLEAUVpKSq/vJcHHl+iiYPq8JQGZjq+soMFFJ2pKBUuYylRKO'
-         'q+DK87/GIYNJRFNTbhPDmFzgF24MAdA1AfxC7h0mf5DZirJ6jaPICJUyntgApECs'
-         'NEgpIq3A2mcmn8l4zMUsmVyWKbvClFkmk/7CmM8W2Vy/Gh1XeD1A4ARXtH/tBDj1'
-         'Q+YNfeBYnCgMwfkiUT7P5GSZcsvMzhJT4R4zrQBmGawyxF6GzbJD5p8OkHcB+KVl'
-         'NixFTNX7wH87lMYB9ABoKe8tAFYBFKsM8/1z/P3yf1f+BRr3PuAGLe5KAAAAAElF'
-         'TkSuQmCC')
-    return base64_decode(s)
-
-
-def urlserver_server_reply_list(conn, sort='-time'):
-    """Send list of URLs as HTML page to client."""
-    global urlserver, urlserver_settings
-    content = '<div class="urls">\n<table id="urls_table">\n'
-    if not sort.startswith('-'):
-        sort = '+%s' % sort
-    if sort[1:] == 'time':
-        urls = sorted(urlserver['urls'].items())
-    else:
-        idx = ['time', 'nick', 'buffer'].index(sort[1:])
-        urls = sorted(urlserver['urls'].items(),
-                      key=lambda url: url[1][idx].lower())
-    if sort.startswith('-'):
-        urls.reverse()
-    sortkey = {
-        '-': ('', '&uarr;'),
-        '+': ('-', '&darr;')
-    }
-    content += '  <tr>'
-    for column, defaultsort in (('time', '-'), ('nick', ''), ('buffer', '')):
-        if sort[1:] == column:
-            content += ('<th class="sortable sorted_by %s_header">'
-                        '<a href="sort=%s%s">%s</a> %s</th>' % (
-                            column,
-                            sortkey[sort[0]][0],
-                            column, column.capitalize(),
-                            sortkey[sort[0]][1]))
-        else:
-            content += ('<th class="sortable %s_header">'
-                        '<a class="sort_link" href="sort=%s%s">%s</a></th>' % (
-                            column,
-                            defaultsort,
-                            column,
-                            column.capitalize()))
-    content += '<th class="unsortable message_header">URLs</th>'
-    content += '</tr>\n'
-    for key, item in urls:
-        content += '  <tr>'
-        url = item[3]
-        obj = ''
-        message = (cgi.escape(item[4].replace(url, '\x01\x02\x03\x04'))
-                   .split('\t', 1))
-        message[0] = '<span class="prefix">%s</span>' % message[0]
-        message[1] = '<span class="message">%s</span>' % message[1]
-
-        strjoin = ('<span class="prefix_suffix"> %s </span>' %
-                   urlserver_settings['http_prefix_suffix']
-                   .replace(' ', '&nbsp;'))
-
-        target = ''
-        if urlserver_settings['http_open_in_new_page'] == 'on':
-            target = ' target=_blank'
-
-        message = strjoin.join(message).replace(
-            '\x01\x02\x03\x04',
-            '</span><a class="url" href="%s" title="%s"%s>%s'
-            '</a><span class="message">' % (
-                urlserver_short_url(key, False), url, target, url))
-        if urlserver_settings['http_embed_image'] == 'on' and \
-                url.lower().endswith(('.jpg', '.jpeg', '.png', '.gif',
-                                      '.bmp', '.svg')):
-            obj = ('<div class="obj"><img src="%s" title="%s" alt="%s">'
-                   '</div>' % (url, url, url))
-        elif urlserver_settings['http_embed_youtube'] == 'on' and \
-                'youtube.com/' in url:
-            m = re.search('v=([\w\d]+)', url)
-            if m:
-                yid = m.group(1)
-                try:
-                    size = (urlserver_settings['http_embed_youtube_size']
-                            .split('*'))
-                    width = int(size[0])
-                    height = int(size[1])
-                except:
-                    width = 480
-                    height = 350
-                obj = ('<div class="obj youtube">'
-                       '<iframe id="%s" type="text/html" width="%d" '
-                       'height="%d" '
-                       'src="https://www.youtube.com/embed/%s?enablejsapi=1">'
-                       '</iframe></div>' % (yid, width, height, yid))
-        content += ('<td class="timestamp">%s</td>'
-                    '<td class="nick">%s</td>'
-                    '<td class="buffer">%s</td><td class="message">' % (
-                        item[0], item[1], item[2]))
-        content += '%s%s</td></tr>\n' % (message, obj)
-    content += '</table>'
-    if len(urlserver_settings['http_css_url']) > 0:
-        css = ('<link rel="stylesheet" type="text/css" href="%s" />' %
-               urlserver_settings['http_css_url'])
-    else:
-        css = ('<style type="text/css" media="screen">'
-               '<!--\n'
-               '  html { font-family: Verdana, Arial, Helvetica; '
-               'font-size: 12px; background: %s; color: %s }\n'
-               '  .urls table { border-collapse: collapse }\n'
-               '  .urls table td,th { border: solid 1px #cccccc; '
-               'padding: 4px; font-size: 12px }\n'
-               '  .timestamp,.nick,.buffer { white-space: nowrap }\n'
-               '  .sorted_by { font-style: italic; }\n'
-               '  .obj { margin-top: 1em }\n'
-               '-->'
-               '</style>\n' % (
-                   urlserver_settings['http_bg_color'],
-                   urlserver_settings['http_fg_color']))
-
-    html = ('<html>\n'
-            '<head>\n'
-            '<title>%s</title>\n'
-            '<meta http-equiv="content-type" content="text/html; '
-            'charset=utf-8" />\n'
-            '%s\n'
-            '<base href="%s" />\n'
-            '<link rel="icon" type="image/png" href="favicon.png" />\n'
-            '</head>\n'
-            '<body>\n%s\n</body>\n'
-            '</html>' % (
-                urlserver_settings['http_title'],
-                css,
-                urlserver_get_base_url(),
-                content))
-    urlserver_server_reply(conn, '200 OK', '', html)
-
-
-def urlserver_check_auth(data):
-    """Check user/password to access a page/URL."""
-    global urlserver_settings
-    if not urlserver_settings['http_auth']:
-        return True
-    http_auth = weechat.string_eval_expression(
-        urlserver_settings['http_auth'], {}, {}, {})
-    auth = re.search('^Authorization: Basic (\S+)$', data,
-                     re.MULTILINE | re.IGNORECASE)
-    if auth and (base64_decode(auth.group(1)).decode('utf-8') == http_auth):
-        return True
-    return False
-
-
-def urlserver_server_fd_cb(data, fd):
-    """Callback for server socket."""
-    global urlserver, urlserver_settings
-    if not urlserver['socket']:
-        return weechat.WEECHAT_RC_OK
-    conn, addr = urlserver['socket'].accept()
-    if urlserver_settings['debug'] == 'on':
-        weechat.prnt('', 'urlserver: connection from %s' % str(addr))
-    if urlserver_settings['http_allowed_ips'] and \
-            not re.match(urlserver_settings['http_allowed_ips'], addr[0]):
-        if urlserver_settings['debug'] == 'on':
-            weechat.prnt('', 'urlserver: IP not allowed')
-        conn.close()
-        return weechat.WEECHAT_RC_OK
-    data = None
-    try:
-        conn.settimeout(0.3)
-        data = conn.recv(4096).decode('utf-8')
-        data = data.replace('\r\n', '\n')
-    except:
-        return weechat.WEECHAT_RC_OK
-    replysent = False
-    sort = '-time'
-    referer = re.search('^Referer:', data, re.MULTILINE | re.IGNORECASE)
-    m = re.search('^GET /(.*) HTTP/.*$', data, re.MULTILINE)
-    if m:
-        url = m.group(1)
-        if urlserver_settings['debug'] == 'on':
-            weechat.prnt('', 'urlserver: %s' % m.group(0))
-        if 'favicon.' in url:
-            urlserver_server_reply(conn, '200 OK', '',
-                                   urlserver_server_favicon(),
-                                   mimetype='image/x-icon')
-            replysent = True
-        else:
-            # check if prefix is ok (if prefix defined in settings)
-            prefixok = True
-            if urlserver_settings['http_url_prefix']:
-                if url.startswith(urlserver_settings['http_url_prefix']):
-                    url = url[len(urlserver_settings['http_url_prefix']):]
-                    if url.startswith('/'):
-                        url = url[1:]
-                else:
-                    prefixok = False
-            # prefix ok, go on with url
-            if prefixok:
-                if url.startswith('sort='):
-                    # sort asked for list of urls
-                    sort = url[5:]
-                    url = ''
-                if url:
-                    # short url, read base62 key and redirect to page
-                    number = -1
-                    try:
-                        number = base62_decode(url)
-                    except:
-                        pass
-                    if number >= 0 and number in urlserver['urls']:
-                        authok = (
-                            urlserver_settings['http_auth_redirect'] != 'on' or
-                            urlserver_check_auth(data)
-                        )
-                        if authok:
-                            # if we have a referer in request, use meta for
-                            # redirection (so that referer is not sent)
-                            # otherwise, we can make redirection with HTTP 302
-                            if referer:
-                                urlserver_server_reply(
-                                    conn, '200 OK', '',
-                                    '<meta name="referrer" content="never">\n'
-                                    '<meta http-equiv="refresh" content="0; '
-                                    'url=%s">' % urlserver['urls'][number][3])
-                            else:
-                                conn.sendall(
-                                    'HTTP/1.1 302\r\n'
-                                    'Location: {}\r\n\r\n'
-                                    .format(urlserver['urls'][number][3])
-                                    .encode('utf-8'))
-                        else:
-                            urlserver_server_reply_auth_required(conn)
-                        replysent = True
-                else:
-                    # page with list of urls
-                    if urlserver_check_auth(data):
-                        urlserver_server_reply_list(conn, sort)
-                    else:
-                        urlserver_server_reply_auth_required(conn)
-                    replysent = True
-            else:
-                if urlserver_settings['debug'] == 'on':
-                    weechat.prnt('', 'urlserver: prefix missing')
-    if not replysent:
-        urlserver_server_reply(conn,
-                               '404 Not found', '',
-                               '<html>\n'
-                               '<head><title>Page not found</title></head>\n'
-                               '<body><h1>Page not found</h1></body>\n'
-                               '</html>')
-    conn.close()
-    return weechat.WEECHAT_RC_OK
-
-
-def urlserver_server_status():
-    """Display status of server."""
-    global urlserver
-    if urlserver['socket']:
-        weechat.prnt('', 'URL server listening on %s' %
-                     str(urlserver['socket'].getsockname()))
-    else:
-        weechat.prnt('', 'URL server not running')
-
-
-def urlserver_server_start():
-    """Start mini HTTP server."""
-    global urlserver, urlserver_settings
-    if urlserver['socket']:
-        weechat.prnt('', 'URL server already running')
-        return
-    port = 0
-    try:
-        port = int(urlserver_settings['http_port'])
-    except:
-        port = 0
-    urlserver['socket'] = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
-    urlserver['socket'].setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
-    try:
-        urlserver['socket'].bind((urlserver_settings['http_hostname'] or
-                                  socket.getfqdn(), port))
-    except Exception as e:
-        weechat.prnt('', '%sBind error: %s' % (weechat.prefix('error'), e))
-        urlserver['socket'] = None
-        urlserver_server_status()
-        return
-    urlserver['socket'].listen(5)
-    urlserver['hook_fd'] = weechat.hook_fd(urlserver['socket'].fileno(),
-                                           1, 0, 0,
-                                           'urlserver_server_fd_cb', '')
-    urlserver_server_status()
-
-
-def urlserver_server_stop():
-    """Stop mini HTTP server."""
-    global urlserver
-    if urlserver['socket'] or urlserver['hook_fd']:
-        if urlserver['socket']:
-            urlserver['socket'].close()
-            urlserver['socket'] = None
-        if urlserver['hook_fd']:
-            weechat.unhook(urlserver['hook_fd'])
-            urlserver['hook_fd'] = None
-        weechat.prnt('', 'URL server stopped')
-
-
-def urlserver_server_restart():
-    """Restart mini HTTP server."""
-    urlserver_server_stop()
-    urlserver_server_start()
-
-
-def urlserver_display_url_detail(key, return_url=False):
-    global urlserver
-    url = urlserver['urls'][key]
-    nick = url[1]
-    if nick:
-        nick += ' @ '
-
-    if return_url:
-        return urlserver_short_url(key)
-    else:
-        weechat.prnt_date_tags(
-            urlserver['buffer'], 0, 'notify_none',
-            '%s, %s%s%s%s: %s%s%s -> %s' % (
-                url[0],
-                nick,
-                weechat.color('chat_buffer'),
-                url[2],
-                weechat.color('reset'),
-                weechat.color(urlserver_settings['color']),
-                urlserver_short_url(key),
-                weechat.color('reset'),
-                url[3]))
-
-
-def urlserver_buffer_input_cb(data, buffer, input_data):
-    if input_data in ('q', 'Q'):
-        weechat.buffer_close(buffer)
-    return weechat.WEECHAT_RC_OK
-
-
-def urlserver_buffer_close_cb(data, buffer):
-    global urlserver
-    urlserver['buffer'] = ''
-    return weechat.WEECHAT_RC_OK
-
-
-def urlserver_open_buffer():
-    global urlserver, urlserver_settings
-    if not urlserver['buffer']:
-        urlserver['buffer'] = weechat.buffer_new(
-            SCRIPT_BUFFER,
-            'urlserver_buffer_input_cb', '',
-            'urlserver_buffer_close_cb', '')
-    if urlserver['buffer']:
-        weechat.buffer_set(urlserver['buffer'], 'title', 'urlserver')
-        weechat.buffer_set(urlserver['buffer'], 'localvar_set_no_log', '1')
-        weechat.buffer_set(urlserver['buffer'], 'time_for_each_line', '0')
-        weechat.buffer_set(urlserver['buffer'], 'print_hooks_enabled', '0')
-        weechat.buffer_clear(urlserver['buffer'])
-        keys = sorted(urlserver['urls'])
-        for key in keys:
-            urlserver_display_url_detail(key)
-        weechat.buffer_set(urlserver['buffer'], 'display', '1')
-
-
-def urlserver_cmd_cb(data, buffer, args):
-    """The /urlserver command."""
-    global urlserver
-    if args == 'start':
-        urlserver_server_start()
-    elif args == 'restart':
-        urlserver_server_restart()
-    elif args == 'stop':
-        urlserver_server_stop()
-    elif args == 'status':
-        urlserver_server_status()
-    elif args == 'clear':
-        urlserver['urls'] = {}
-        urlserver['number'] = 0
-        weechat.prnt('', 'urlserver: list cleared')
-    else:
-        urlserver_open_buffer()
-    return weechat.WEECHAT_RC_OK
-
-
-def urlserver_update_urllist(buffer_full_name, buffer_short_name, tags, prefix,
-                             message, nick=None):
-    """Update urls list and return a list of short urls for message."""
-    global urlserver, urlserver_settings
-
-    # skip ignored buffers
-    if urlserver_settings['msg_ignore_buffers'] and \
-            buffer_full_name in (urlserver_settings['msg_ignore_buffers']
-                                 .split(',')):
-        return None
-
-    listtags = []
-    if tags:
-        listtags = tags.split(',')
-
-        # skip ignored tags
-        if urlserver_settings['msg_ignore_tags']:
-            for itag in urlserver_settings['msg_ignore_tags'].split(','):
-                for tag in listtags:
-                    if tag.startswith(itag):
-                        return None
-
-        # exit if a required tag is missing
-        if urlserver_settings['msg_require_tags']:
-            for rtag in urlserver_settings['msg_require_tags'].split(','):
-                tagfound = False
-                for tag in listtags:
-                    if tag.startswith(rtag):
-                        tagfound = True
-                        break
-                if not tagfound:
-                    return None
-
-    # ignore message is matching the "msg_ignore_regex"
-    if urlserver_settings['msg_ignore_regex']:
-        if re.search(urlserver_settings['msg_ignore_regex'],
-                     prefix + '\t' + message):
-            return None
-
-    # extract nick from tags
-    if not nick:
-        nick = ''
-        for tag in listtags:
-            if tag.startswith('nick_'):
-                nick = tag[5:]
-                break
-
-    # get URL min length
-    min_length = 0
-    try:
-        min_length = int(urlserver_settings['url_min_length'])
-        # Detect the minimum length based on shorten url length
-        if min_length == -1:
-            min_length = len(urlserver_short_url(urlserver['number'])) + 1
-    except:
-        min_length = 0
-
-    # shorten URL(s) in message
-    urls_short = []
-    for url in urlserver['regex'].findall(message):
-        if len(url) >= min_length:
-            if urlserver_settings['msg_ignore_dup_urls'] == 'on':
-                same_urls = [key for key, value in urlserver['urls'].items()
-                             if value[3] == url]
-                if same_urls:
-                    continue
-            number = urlserver['number']
-            # don't save urls already shortened
-            if not url.startswith(urlserver_get_base_url()):
-                urlserver['urls'][number] = (
-                    datetime.datetime.now().strftime(
-                        urlserver_settings['http_time_format']),
-                    nick,
-                    buffer_short_name,
-                    url,
-                    '%s\t%s' % (prefix, message))
-                urls_short.append(urlserver_short_url(number))
-                if urlserver['buffer']:
-                    urlserver_display_url_detail(number)
-                urlserver['number'] += 1
-
-    # remove old URLs if we have reach max list size
-    urls_amount = 50
-    try:
-        urls_amount = int(urlserver_settings['urls_amount'])
-        if urls_amount <= 0:
-            urls_amount = 50
-    except:
-        urls_amount = 50
-    while len(urlserver['urls']) > urls_amount:
-        keys = sorted(urlserver['urls'])
-        del urlserver['urls'][keys[0]]
-
-    return urls_short
-
-
-def urlserver_print_cb(data, buffer, time, tags, displayed, highlight, prefix,
-                       message):
-    """
-    Callback for message printed in buffer: display short URLs after message.
-    """
-    global urlserver, urlserver_settings
-
-    if not displayed and urlserver_settings['msg_filtered'] != 'on':
-        return weechat.WEECHAT_RC_OK
-
-    if urlserver_settings['display_urls'] == 'on':
-        buffer_full_name = '%s.%s' % (
-            weechat.buffer_get_string(buffer, 'plugin'),
-            weechat.buffer_get_string(buffer, 'name'))
-        if urlserver_settings['buffer_short_name'] == 'on':
-            buffer_short_name = weechat.buffer_get_string(buffer, 'short_name')
-        else:
-            buffer_short_name = buffer_full_name
-        urls_short = urlserver_update_urllist(buffer_full_name,
-                                              buffer_short_name,
-                                              tags,
-                                              prefix,
-                                              message)
-        if urls_short:
-            if urlserver_settings['separators'] and \
-                    len(urlserver_settings['separators']) == 3:
-                separator = ' %s ' % (urlserver_settings['separators'][1])
-                urls_string = separator.join(urls_short)
-                urls_string = '%s %s %s' % (
-                    urlserver_settings['separators'][0],
-                    urls_string,
-                    urlserver_settings['separators'][2])
-            else:
-                urls_string = ' | '.join(urls_short)
-                urls_string = '[ ' + urls_string + ' ]'
-            weechat.prnt_date_tags(
-                buffer, 0, 'no_log,notify_none',
-                '%s%s' % (weechat.color(urlserver_settings['color']),
-                          urls_string))
-
-    return weechat.WEECHAT_RC_OK
-
-
-def urlserver_modifier_irc_cb(data, modifier, modifier_data, string):
-    """Modifier for IRC message: add short URLs at the end of IRC message."""
-    global urlserver, urlserver_settings
-
-    if urlserver_settings['display_urls_in_msg'] != 'on':
-        return string
-
-    msg = weechat.info_get_hashtable(
-        'irc_message_parse',
-        {'message': string, 'server': modifier_data})
-    if 'nick' not in msg or 'channel' not in msg or 'arguments' not in msg:
-        return string
-
-    try:
-        message = msg['arguments'].split(' ', 1)[1]
-        if message.startswith(':'):
-            message = message[1:]
-    except:
-        return string
-
-    info_name = '%s,%s' % (modifier_data, msg['channel'])
-    if weechat.info_get('irc_is_channel', info_name) == '1':
-        name = msg['channel']
-    else:
-        name = msg['nick']
-    buffer_full_name = 'irc.%s.%s' % (modifier_data, name)
-    if urlserver_settings['buffer_short_name'] == 'on':
-        buffer_short_name = name
-    else:
-        buffer_short_name = buffer_full_name
-    urls_short = urlserver_update_urllist(buffer_full_name,
-                                          buffer_short_name,
-                                          None,
-                                          msg['nick'],
-                                          message,
-                                          msg['nick'])
-    if urls_short:
-        if urlserver_settings['separators'] and \
-                len(urlserver_settings['separators']) == 3:
-            separator = ' %s ' % (urlserver_settings['separators'][1])
-            urls_string = separator.join(urls_short)
-            urls_string = '%s %s %s' % (
-                urlserver_settings['separators'][0],
-                urls_string,
-                urlserver_settings['separators'][2])
-        else:
-            urls_string = ' | '.join(urls_short)
-            urls_string = '[ ' + urls_string + ' ]'
-
-        if urlserver_settings['color_in_msg']:
-            urls_string = '\x03%s%s' % (urlserver_settings['color_in_msg'],
-                                        urls_string)
-        string = "%s %s" % (string, urls_string)
-
-    return string
-
-
-def urlserver_config_cb(data, option, value):
-    """Called when a script option is changed."""
-    global urlserver_settings
-    pos = option.rfind('.')
-    if pos > 0:
-        name = option[pos+1:]
-        if name in urlserver_settings:
-            if name == 'http_allowed_ips':
-                urlserver_settings[name] = re.compile(value)
-            else:
-                urlserver_settings[name] = value
-                if name in ('http_hostname', 'http_port'):
-                    # don't restart if autostart is disabled and server isn't
-                    # already running
-                    if urlserver_settings['http_autostart'] == 'on' or \
-                            urlserver['socket']:
-                        urlserver_server_restart()
-    return weechat.WEECHAT_RC_OK
-
-
-def urlserver_filename():
-    """Return name of file used to store list of urls."""
-    return os.path.join(weechat.info_get('weechat_dir', ''),
-                        'urlserver_list.txt')
-
-
-def urlserver_read_urls():
-    """Read file with URLs."""
-    global urlserver
-    filename = urlserver_filename()
-    if os.path.isfile(filename):
-        urlserver['number'] = 0
-        try:
-            urlserver['urls'] = ast.literal_eval(open(filename, 'r').read())
-            keys = sorted(urlserver['urls'])
-            if keys:
-                urlserver['number'] = keys[-1] + 1
-            else:
-                urlserver['number'] = 0
-        except:
-            weechat.prnt('', '%surlserver: error reading file "%s"' % (
-                weechat.prefix('error'),
-                filename))
-
-
-def urlserver_write_urls():
-    """Write file with URLs."""
-    global urlserver
-    keys = sorted(urlserver['urls'])
-    content = '{\n%s\n}\n' % '\n'.join([
-        '  %d: %s,' % (key, str(urlserver['urls'][key])) for key in keys
-    ])
-    open(urlserver_filename(), 'w').write(content)
-
-
-def urlserver_end():
-    """Script unloaded (oh no, why?)"""
-    urlserver_server_stop()
-    urlserver_write_urls()
-    return weechat.WEECHAT_RC_OK
-
-if __name__ == '__main__' and import_ok:
-    if weechat.register(SCRIPT_NAME, SCRIPT_AUTHOR, SCRIPT_VERSION,
-                        SCRIPT_LICENSE, SCRIPT_DESC, 'urlserver_end', ''):
-        # set default settings
-        version = weechat.info_get('version_number', '') or 0
-        for option, value in urlserver_settings_default.items():
-            if weechat.config_is_set_plugin(option):
-                urlserver_settings[option] = weechat.config_get_plugin(option)
-            else:
-                weechat.config_set_plugin(option, value[0])
-                urlserver_settings[option] = value[0]
-            if int(version) >= 0x00030500:
-                weechat.config_set_desc_plugin(
-                    option,
-                    '%s (default: "%s")' % (value[1], value[0]))
-
-        # detect config changes
-        weechat.hook_config('plugins.var.python.%s.*' % SCRIPT_NAME,
-                            'urlserver_config_cb', '')
-
-        # add command
-        weechat.hook_command(
-            SCRIPT_COMMAND,
-            SCRIPT_DESC,
-            'start|restart|stop|status || clear',
-            '  start: start server\n'
-            'restart: restart server\n'
-            '   stop: stop server\n'
-            ' status: display status of server\n'
-            '  clear: remove all URLs from list\n\n'
-            'Without argument, this command opens new buffer with list of '
-            'URLs.\n\n'
-            'Initial setup:\n'
-            '  - by default, script will listen on a random free port, '
-            'you can force a port with:\n'
-            '      /set plugins.var.python.urlserver.http_port "1234"\n'
-            '  - you can force an IP or custom hostname with:\n'
-            '      /set plugins.var.python.urlserver.http_hostname '
-            '"111.22.33.44"\n'
-            '  - it is strongly recommended to restrict IPs allowed and/or '
-            'use auth, for example:\n'
-            '      /set plugins.var.python.urlserver.http_allowed_ips '
-            '"^(123.45.67.89|192.160.*)$"\n'
-            '      /set plugins.var.python.urlserver.http_auth '
-            '"user:password"\n'
-            '  - if you do not like the default HTML formatting, you can '
-            'override the CSS:\n'
-            '      /set plugins.var.python.urlserver.http_css_url '
-            '"http://example.com/sample.css"\n'
-            '      See https://raw.github.com/FiXato/weechat_scripts/master/'
-            'urlserver/sample.css\n'
-            '  - don\'t like the built-in HTTP server to start automatically? '
-            'Disable it:\n'
-            '      /set plugins.var.python.urlserver.http_autostart "off"\n'
-            '  - have external port 80 or 443 (https) forwarded to your '
-            'internal server port? Remove :port with:\n'
-            '      /set plugins.var.python.urlserver.http_port_display "80" '
-            'or "443" respectively\n'
-            '\n'
-            'Tip: use URL without key at the end to display list of all URLs '
-            'in your browser.',
-            'start|restart|stop|status|clear', 'urlserver_cmd_cb', '')
-
-        if urlserver_settings['http_autostart'] == 'on':
-            # start mini HTTP server
-            urlserver_server_start()
-
-        # load urls from file
-        urlserver_read_urls()
-
-        # catch URLs in buffers
-        weechat.hook_print('', '', '://', 1, 'urlserver_print_cb', '')
-
-        # modify URLS in irc messages (for relay)
-        weechat.hook_modifier('irc_in2_privmsg',
-                              'urlserver_modifier_irc_cb', '')
-        weechat.hook_modifier('irc_in2_notice',
-                              'urlserver_modifier_irc_cb', '')
-
-        # search buffer
-        urlserver['buffer'] = weechat.buffer_search('python', SCRIPT_BUFFER)
diff --git a/.weechat/relay.conf b/.weechat/relay.conf
deleted file mode 100644
index 565dd145..00000000
--- a/.weechat/relay.conf
+++ /dev/null
@@ -1,48 +0,0 @@
-#
-# weechat -- relay.conf
-#
-# WARNING: It is NOT recommended to edit this file by hand,
-# especially if WeeChat is running.
-#
-# Use /set or similar command to change settings in WeeChat.
-#
-# For more info, see: https://weechat.org/doc/quickstart
-#
-
-[look]
-auto_open_buffer = on
-raw_messages = 256
-
-[color]
-client = cyan
-status_active = lightblue
-status_auth_failed = lightred
-status_connecting = yellow
-status_disconnected = lightred
-status_waiting_auth = brown
-text = default
-text_bg = default
-text_selected = white
-
-[network]
-allow_empty_password = off
-allowed_ips = ""
-bind_address = ""
-clients_purge_delay = 0
-compression_level = 6
-ipv6 = on
-max_clients = 5
-password = ""
-ssl_cert_key = "%h/ssl/relay.pem"
-ssl_priorities = "NORMAL:-VERS-SSL3.0"
-websocket_allowed_origins = ""
-
-[irc]
-backlog_max_minutes = 1440
-backlog_max_number = 256
-backlog_since_last_disconnect = on
-backlog_since_last_message = off
-backlog_tags = "irc_privmsg"
-backlog_time_format = "[%H:%M] "
-
-[port]
diff --git a/.weechat/script.conf b/.weechat/script.conf
deleted file mode 100644
index 445a2d69..00000000
--- a/.weechat/script.conf
+++ /dev/null
@@ -1,56 +0,0 @@
-#
-# weechat -- script.conf
-#
-# WARNING: It is NOT recommended to edit this file by hand,
-# especially if WeeChat is running.
-#
-# Use /set or similar command to change settings in WeeChat.
-#
-# For more info, see: https://weechat.org/doc/quickstart
-#
-
-[look]
-columns = "%s %n %V %v %u | %d | %t"
-diff_color = on
-diff_command = "auto"
-display_source = on
-quiet_actions = on
-sort = "p,n"
-translate_description = on
-use_keys = on
-
-[color]
-status_autoloaded = cyan
-status_held = white
-status_installed = lightcyan
-status_obsolete = lightmagenta
-status_popular = yellow
-status_running = lightgreen
-status_unknown = lightred
-text = default
-text_bg = default
-text_bg_selected = red
-text_date = default
-text_date_selected = white
-text_delimiters = default
-text_description = default
-text_description_selected = white
-text_extension = default
-text_extension_selected = white
-text_name = cyan
-text_name_selected = lightcyan
-text_selected = white
-text_tags = brown
-text_tags_selected = yellow
-text_version = magenta
-text_version_loaded = default
-text_version_loaded_selected = white
-text_version_selected = lightmagenta
-
-[scripts]
-autoload = on
-cache_expire = 1440
-download_timeout = 30
-hold = ""
-path = "%h/script"
-url = "http://weechat.org/files/plugins.xml.gz"
diff --git a/.weechat/trigger.conf b/.weechat/trigger.conf
deleted file mode 100644
index c2f63f99..00000000
--- a/.weechat/trigger.conf
+++ /dev/null
@@ -1,115 +0,0 @@
-#
-# weechat -- trigger.conf
-#
-# WARNING: It is NOT recommended to edit this file by hand,
-# especially if WeeChat is running.
-#
-# Use /set or similar command to change settings in WeeChat.
-#
-# For more info, see: https://weechat.org/doc/quickstart
-#
-
-[look]
-enabled = on
-monitor_strip_colors = off
-
-[color]
-flag_command = lightgreen
-flag_conditions = yellow
-flag_post_action = lightblue
-flag_regex = lightcyan
-flag_return_code = lightmagenta
-regex = white
-replace = cyan
-trigger = green
-trigger_disabled = red
-
-[trigger]
-beep.arguments = ""
-beep.command = "/print -beep"
-beep.conditions = "${tg_displayed} && (${tg_highlight} || ${tg_msg_pv})"
-beep.enabled = on
-beep.hook = print
-beep.post_action = none
-beep.regex = ""
-beep.return_code = ok
-bufferswitch.arguments = "buffer_switch"
-bufferswitch.command = "/perlexec weechat::buffer_set(weechat::hdata_get_list(weechat::hdata_get('buffer'),'gui_buffer_last_displayed'), 'unread', 0)\;"
-bufferswitch.conditions = ""
-bufferswitch.enabled = on
-bufferswitch.hook = signal
-bufferswitch.post_action = none
-bufferswitch.regex = ""
-bufferswitch.return_code = ok
-cmd_pass.arguments = "5000|input_text_display;5000|history_add;5000|irc_command_auth"
-cmd_pass.command = ""
-cmd_pass.conditions = ""
-cmd_pass.enabled = on
-cmd_pass.hook = modifier
-cmd_pass.post_action = none
-cmd_pass.regex = "==^((/(msg|m|quote) +nickserv +(id|identify|register|ghost +[^ ]+|release +[^ ]+|regain +[^ ]+|recover +[^ ]+) +)|/oper +[^ ]+ +|/quote +pass +|/set +[^ ]*password[^ ]* +|/secure +(passphrase|decrypt|set +[^ ]+) +)(.*)==${re:1}${hide:*,${re:+}}"
-cmd_pass.return_code = ok
-detach.arguments = "10000;0;0"
-detach.command = "/allchan /eval /perlexec weechat::command('', '/command -buffer irc.\${server}.\${channel} core /buffer hide') if ((${date:%s} - \${buffer[\${info:irc_buffer,\${server},\${channel}}].lines.last_line.data.date}) > 100 && '\${window.buffer.full_name}' !~ 'irc.\${server}.\${channel}' && '\${buffer[\${info:irc_buffer,\${server},\${channel}}].hotlist}' eq '0x0')"
-detach.conditions = ""
-detach.enabled = on
-detach.hook = timer
-detach.post_action = none
-detach.regex = ""
-detach.return_code = ok
-force_redraw.arguments = "window_switch;buffer_switch"
-force_redraw.command = "/wait 1ms /redraw"
-force_redraw.conditions = ""
-force_redraw.enabled = on
-force_redraw.hook = signal
-force_redraw.post_action = none
-force_redraw.regex = ""
-force_redraw.return_code = ok
-msg_auth.arguments = "5000|irc_message_auth"
-msg_auth.command = ""
-msg_auth.conditions = ""
-msg_auth.enabled = on
-msg_auth.hook = modifier
-msg_auth.post_action = none
-msg_auth.regex = "==^(.*(id|identify|register|ghost +[^ ]+|release +[^ ]+|regain +[^ ]+|recover +[^ ]+) +)(.*)==${re:1}${hide:*,${re:+}}"
-msg_auth.return_code = ok
-reattach.arguments = ""
-reattach.command = "/command -buffer irc.$server.$channel core /buffer unhide"
-reattach.conditions = "${buffer.hidden} == 1 && ${tg_tag_notify} == message"
-reattach.enabled = on
-reattach.hook = print
-reattach.post_action = none
-reattach.regex = ""
-reattach.return_code = ok
-reattach_on_switch.arguments = "buffer_switch"
-reattach_on_switch.command = "/command -buffer ${buffer[${tg_signal_data}].full_name} core /buffer unhide"
-reattach_on_switch.conditions = "${buffer[${tg_signal_data}].hidden} == 1"
-reattach_on_switch.enabled = on
-reattach_on_switch.hook = signal
-reattach_on_switch.post_action = none
-reattach_on_switch.regex = ""
-reattach_on_switch.return_code = ok
-server_pass.arguments = "5000|input_text_display;5000|history_add"
-server_pass.command = ""
-server_pass.conditions = ""
-server_pass.enabled = on
-server_pass.hook = modifier
-server_pass.post_action = none
-server_pass.regex = "==^(/(server|connect) .*-(sasl_)?password=)([^ ]+)(.*)==${re:1}${hide:*,${re:4}}${re:5}"
-server_pass.return_code = ok
-windowswitch.arguments = "window_switch"
-windowswitch.command = "/perlexec weechat::buffer_set(weechat::window_get_pointer('${tg_signal_data}','buffer'), 'hotlist', -1);"
-windowswitch.conditions = ""
-windowswitch.enabled = on
-windowswitch.hook = signal
-windowswitch.post_action = none
-windowswitch.regex = ""
-windowswitch.return_code = ok
-znctoserver.arguments = "irc_in_privmsg"
-znctoserver.command = "/print -buffer server.${server} znc: ${text}"
-znctoserver.conditions = "${host} == *status!znc@znc.in || ${host} == *controlpanel!znc@znc.in || ${host} == *identfile!znc@znc.in || ${host} == *q!znc@znc.in"
-znctoserver.enabled = on
-znctoserver.hook = modifier
-znctoserver.post_action = none
-znctoserver.regex = "/.*//"
-znctoserver.return_code = ok
diff --git a/.weechat/weechat.conf b/.weechat/weechat.conf
deleted file mode 100644
index 4fbd3be4..00000000
--- a/.weechat/weechat.conf
+++ /dev/null
@@ -1,648 +0,0 @@
-#
-# weechat -- weechat.conf
-#
-# WARNING: It is NOT recommended to edit this file by hand,
-# especially if WeeChat is running.
-#
-# Use /set or similar command to change settings in WeeChat.
-#
-# For more info, see: https://weechat.org/doc/quickstart
-#
-
-[debug]
-
-[startup]
-command_after_plugins = ""
-command_before_plugins = ""
-display_logo = on
-display_version = on
-sys_rlimit = ""
-
-[look]
-align_end_of_lines = message
-align_multiline_words = on
-bar_more_down = "++"
-bar_more_left = "<<"
-bar_more_right = ">>"
-bar_more_up = "--"
-bare_display_exit_on_input = on
-bare_display_time_format = "%H:%M"
-buffer_auto_renumber = on
-buffer_notify_default = all
-buffer_position = end
-buffer_search_case_sensitive = off
-buffer_search_force_default = off
-buffer_search_regex = off
-buffer_search_where = prefix_message
-buffer_time_format = "${253}%H:${245}%M"
-color_basic_force_bold = off
-color_inactive_buffer = on
-color_inactive_message = on
-color_inactive_prefix = on
-color_inactive_prefix_buffer = on
-color_inactive_time = off
-color_inactive_window = on
-color_nick_offline = off
-color_pairs_auto_reset = 5
-color_real_white = off
-command_chars = ""
-command_incomplete = off
-confirm_quit = off
-confirm_upgrade = off
-day_change = on
-day_change_message_1date = "-- %a, %d %b %Y --"
-day_change_message_2dates = "-- %%a, %%d %%b %%Y (%a, %d %b %Y) --"
-eat_newline_glitch = off
-emphasized_attributes = ""
-highlight = "alpha,kejadlen"
-highlight_regex = ""
-highlight_tags = ""
-hotlist_add_conditions = "${away} || ${buffer} != ${window.buffer}"
-hotlist_buffer_separator = ", "
-hotlist_count_max = 2
-hotlist_count_min_msg = 2
-hotlist_names_count = 3
-hotlist_names_length = 0
-hotlist_names_level = 12
-hotlist_names_merged_buffers = off
-hotlist_prefix = "H: "
-hotlist_remove = merged
-hotlist_short_names = on
-hotlist_sort = group_time_asc
-hotlist_suffix = ""
-hotlist_unique_numbers = on
-input_cursor_scroll = 20
-input_share = none
-input_share_overwrite = off
-input_undo_max = 32
-item_away_message = on
-item_buffer_filter = "*"
-item_buffer_zoom = "!"
-item_mouse_status = "M"
-item_time_format = "%H:%M"
-jump_current_to_previous_buffer = on
-jump_previous_buffer_when_closing = on
-jump_smart_back_to_buffer = on
-key_bind_safe = on
-key_grab_delay = 800
-mouse = off
-mouse_timer_delay = 100
-nick_color_force = ""
-nick_color_hash = djb2
-nick_color_stop_chars = "_|["
-nick_prefix = ""
-nick_suffix = ""
-paste_auto_add_newline = on
-paste_bracketed = on
-paste_bracketed_timer_delay = 10
-paste_max_lines = 1
-prefix_action = " *"
-prefix_align = right
-prefix_align_max = 0
-prefix_align_min = 0
-prefix_align_more = "+"
-prefix_align_more_after = on
-prefix_buffer_align = right
-prefix_buffer_align_max = 0
-prefix_buffer_align_more = "+"
-prefix_buffer_align_more_after = on
-prefix_error = "=!="
-prefix_join = "-->"
-prefix_network = "--"
-prefix_quit = "<--"
-prefix_same_nick = ""
-prefix_suffix = "|"
-quote_nick_prefix = "<"
-quote_nick_suffix = ">"
-quote_time_format = "%H:%M:%S"
-read_marker = line
-read_marker_always_show = off
-read_marker_string = "- "
-save_config_on_exit = on
-save_layout_on_exit = none
-scroll_amount = 3
-scroll_bottom_after_switch = off
-scroll_page_percent = 100
-search_text_not_found_alert = on
-separator_horizontal = "-"
-separator_vertical = ""
-tab_width = 1
-time_format = "%a, %d %b %Y %T"
-window_auto_zoom = off
-window_separator_horizontal = on
-window_separator_vertical = on
-window_title = "WeeChat ${info:version}"
-word_chars_highlight = "!\u00A0,-,_,|,alnum"
-word_chars_input = "!\u00A0,-,_,|,alnum"
-
-[palette]
-
-[color]
-bar_more = lightmagenta
-chat = default
-chat_bg = default
-chat_buffer = white
-chat_channel = white
-chat_day_change = cyan
-chat_delimiters = green
-chat_highlight = yellow
-chat_highlight_bg = magenta
-chat_host = cyan
-chat_inactive_buffer = default
-chat_inactive_window = default
-chat_nick = lightcyan
-chat_nick_colors = "red,green,brown,blue,magenta,cyan,white,lightred,lightgreen,yellow,lightblue,lightmagenta,lightcyan"
-chat_nick_offline = default
-chat_nick_offline_highlight = default
-chat_nick_offline_highlight_bg = blue
-chat_nick_other = cyan
-chat_nick_prefix = green
-chat_nick_self = white
-chat_nick_suffix = green
-chat_prefix_action = white
-chat_prefix_buffer = brown
-chat_prefix_buffer_inactive_buffer = default
-chat_prefix_error = yellow
-chat_prefix_join = lightgreen
-chat_prefix_more = lightmagenta
-chat_prefix_network = magenta
-chat_prefix_quit = lightred
-chat_prefix_suffix = green
-chat_read_marker = magenta
-chat_read_marker_bg = default
-chat_server = brown
-chat_tags = red
-chat_text_found = yellow
-chat_text_found_bg = lightmagenta
-chat_time = default
-chat_time_delimiters = brown
-chat_value = cyan
-chat_value_null = blue
-emphasized = yellow
-emphasized_bg = magenta
-input_actions = lightgreen
-input_text_not_found = red
-item_away = yellow
-nicklist_away = cyan
-nicklist_group = green
-separator = blue
-status_count_highlight = magenta
-status_count_msg = brown
-status_count_other = default
-status_count_private = green
-status_data_highlight = lightmagenta
-status_data_msg = yellow
-status_data_other = default
-status_data_private = lightgreen
-status_filter = green
-status_more = yellow
-status_mouse = green
-status_name = white
-status_name_ssl = lightgreen
-status_nicklist_count = default
-status_number = yellow
-status_time = default
-
-[completion]
-base_word_until_cursor = on
-command_inline = on
-default_template = "%(nicks)|%(irc_channels)"
-nick_add_space = on
-nick_case_sensitive = off
-nick_completer = ":"
-nick_first_only = off
-nick_ignore_chars = "[]`_-^"
-partial_completion_alert = on
-partial_completion_command = off
-partial_completion_command_arg = off
-partial_completion_count = on
-partial_completion_other = off
-
-[history]
-display_default = 5
-max_buffer_lines_minutes = 0
-max_buffer_lines_number = 4096
-max_commands = 100
-max_visited_buffers = 50
-
-[proxy]
-
-[network]
-connection_timeout = 60
-gnutls_ca_file = "/usr/local/etc/openssl/cert.pem"
-gnutls_handshake_timeout = 30
-proxy_curl = ""
-
-[plugin]
-autoload = "*"
-debug = off
-extension = ".so,.dll"
-path = "%h/plugins"
-save_config_on_unload = on
-
-[bar]
-buflist.color_bg = default
-buflist.color_delim = default
-buflist.color_fg = default
-buflist.conditions = ""
-buflist.filling_left_right = vertical
-buflist.filling_top_bottom = columns_vertical
-buflist.hidden = off
-buflist.items = "buflist"
-buflist.position = top
-buflist.priority = 0
-buflist.separator = on
-buflist.size = 0
-buflist.size_max = 0
-buflist.type = root
-input.color_bg = default
-input.color_delim = cyan
-input.color_fg = default
-input.conditions = ""
-input.filling_left_right = vertical
-input.filling_top_bottom = horizontal
-input.hidden = off
-input.items = "[input_prompt]+(away),[input_search],[input_paste],input_text"
-input.position = bottom
-input.priority = 1000
-input.separator = off
-input.size = 1
-input.size_max = 0
-input.type = window
-isetbar.color_bg = default
-isetbar.color_delim = cyan
-isetbar.color_fg = default
-isetbar.conditions = ""
-isetbar.filling_left_right = vertical
-isetbar.filling_top_bottom = horizontal
-isetbar.hidden = on
-isetbar.items = "isetbar_help"
-isetbar.position = top
-isetbar.priority = 0
-isetbar.separator = on
-isetbar.size = 3
-isetbar.size_max = 3
-isetbar.type = window
-nicklist.color_bg = default
-nicklist.color_delim = cyan
-nicklist.color_fg = default
-nicklist.conditions = "${nicklist}"
-nicklist.filling_left_right = vertical
-nicklist.filling_top_bottom = columns_vertical
-nicklist.hidden = on
-nicklist.items = "buffer_nicklist"
-nicklist.position = right
-nicklist.priority = 200
-nicklist.separator = on
-nicklist.size = 0
-nicklist.size_max = 0
-nicklist.type = window
-status.color_bg = black
-status.color_delim = cyan
-status.color_fg = default
-status.conditions = ""
-status.filling_left_right = vertical
-status.filling_top_bottom = horizontal
-status.hidden = off
-status.items = "[time],[buffer_last_number],[buffer_plugin],buffer_number+:+buffer_name+(buffer_modes)+{buffer_nicklist_count}+buffer_zoom+buffer_filter,scroll,[lag],[hotlist],completion"
-status.position = bottom
-status.priority = 500
-status.separator = off
-status.size = 1
-status.size_max = 0
-status.type = window
-title.color_bg = black
-title.color_delim = cyan
-title.color_fg = default
-title.conditions = ""
-title.filling_left_right = vertical
-title.filling_top_bottom = horizontal
-title.hidden = off
-title.items = "buffer_title"
-title.position = top
-title.priority = 500
-title.separator = off
-title.size = 1
-title.size_max = 0
-title.type = window
-
-[layout]
-_zoom.window = "1;0;0;0;irc;pivotal.alidaka"
-
-[notify]
-
-[filter]
-irc_smart = on;*;irc_smart_filter;*
-irc_disconnected = on;*;*;^irc: disconnected from server$
-alpha_join = on;*;irc_join,host_alpha;*
-
-[key]
-ctrl-? = "/input delete_previous_char"
-ctrl-A = "/input move_beginning_of_line"
-ctrl-B = "/input move_previous_char"
-ctrl-C_ = "/input insert \x1F"
-ctrl-Cb = "/input insert \x02"
-ctrl-Cc = "/input insert \x03"
-ctrl-Ci = "/input insert \x1D"
-ctrl-Co = "/input insert \x0F"
-ctrl-Cv = "/input insert \x16"
-ctrl-D = "/input delete_next_char"
-ctrl-E = "/input move_end_of_line"
-ctrl-F = "/input move_next_char"
-ctrl-H = "/input delete_previous_char"
-ctrl-I = "/input complete_next"
-ctrl-J = "/input return"
-ctrl-K = "/input delete_end_of_line"
-ctrl-L = "/window refresh"
-ctrl-M = "/input return"
-ctrl-N = "/buffer +1"
-ctrl-P = "/buffer -1"
-ctrl-R = "/input search_text_here"
-ctrl-Sctrl-U = "/input set_unread"
-ctrl-T = "/input transpose_chars"
-ctrl-U = "/input delete_beginning_of_line"
-ctrl-W = "/input delete_previous_word"
-ctrl-X = "/input switch_active_buffer"
-ctrl-Y = "/input clipboard_paste"
-meta-meta-OP = "/bar scroll buflist * b"
-meta-meta-OQ = "/bar scroll buflist * e"
-meta-meta2-1~ = "/window scroll_top"
-meta-meta2-23~ = "/bar scroll nicklist * b"
-meta-meta2-24~ = "/bar scroll nicklist * e"
-meta-meta2-4~ = "/window scroll_bottom"
-meta-meta2-5~ = "/window scroll_up"
-meta-meta2-6~ = "/window scroll_down"
-meta-meta2-7~ = "/window scroll_top"
-meta-meta2-8~ = "/window scroll_bottom"
-meta-meta2-A = "/buffer -1"
-meta-meta2-B = "/buffer +1"
-meta-meta2-C = "/buffer +1"
-meta-meta2-D = "/buffer -1"
-meta-- = "/filter toggle @"
-meta-/ = "/input jump_last_buffer_displayed"
-meta-0 = "/buffer *10"
-meta-1 = "/buffer *1"
-meta-2 = "/buffer *2"
-meta-3 = "/buffer *3"
-meta-4 = "/buffer *4"
-meta-5 = "/buffer *5"
-meta-6 = "/buffer *6"
-meta-7 = "/buffer *7"
-meta-8 = "/buffer *8"
-meta-9 = "/buffer *9"
-meta-< = "/input jump_previously_visited_buffer"
-meta-= = "/filter toggle"
-meta-> = "/input jump_next_visited_buffer"
-meta-OA = "/input history_global_previous"
-meta-OB = "/input history_global_next"
-meta-OC = "/input move_next_word"
-meta-OD = "/input move_previous_word"
-meta-OF = "/input move_end_of_line"
-meta-OH = "/input move_beginning_of_line"
-meta-OP = "/bar scroll buflist * -100%"
-meta-OQ = "/bar scroll buflist * +100%"
-meta-Oa = "/input history_global_previous"
-meta-Ob = "/input history_global_next"
-meta-Oc = "/input move_next_word"
-meta-Od = "/input move_previous_word"
-meta2-15~ = "/buffer -1"
-meta2-17~ = "/buffer +1"
-meta2-18~ = "/window -1"
-meta2-19~ = "/window +1"
-meta2-1;3A = "/buffer -1"
-meta2-1;3B = "/buffer +1"
-meta2-1;3C = "/buffer +1"
-meta2-1;3D = "/buffer -1"
-meta2-1;3F = "/window scroll_bottom"
-meta2-1;3H = "/window scroll_top"
-meta2-1;5A = "/input history_global_previous"
-meta2-1;5B = "/input history_global_next"
-meta2-1;5C = "/input move_next_word"
-meta2-1;5D = "/input move_previous_word"
-meta2-1~ = "/input move_beginning_of_line"
-meta2-200~ = "/input paste_start"
-meta2-201~ = "/input paste_stop"
-meta2-20~ = "/bar scroll title * -30%"
-meta2-21~ = "/bar scroll title * +30%"
-meta2-23;3~ = "/bar scroll nicklist * b"
-meta2-23~ = "/bar scroll nicklist * -100%"
-meta2-24;3~ = "/bar scroll nicklist * e"
-meta2-24~ = "/bar scroll nicklist * +100%"
-meta2-3~ = "/input delete_next_char"
-meta2-4~ = "/input move_end_of_line"
-meta2-5;3~ = "/window scroll_up"
-meta2-5~ = "/window page_up"
-meta2-6;3~ = "/window scroll_down"
-meta2-6~ = "/window page_down"
-meta2-7~ = "/input move_beginning_of_line"
-meta2-8~ = "/input move_end_of_line"
-meta2-A = "/input history_previous"
-meta2-B = "/input history_next"
-meta2-C = "/input move_next_char"
-meta2-D = "/input move_previous_char"
-meta2-F = "/input move_end_of_line"
-meta2-G = "/window page_down"
-meta2-H = "/input move_beginning_of_line"
-meta2-I = "/window page_up"
-meta2-Z = "/input complete_previous"
-meta2-[E = "/buffer -1"
-meta-_ = "/input redo"
-meta-a = "/input jump_smart"
-meta-b = "/input move_previous_word"
-meta-d = "/input delete_next_word"
-meta-f = "/input move_next_word"
-meta-h = "/input hotlist_clear"
-meta-jmeta-f = "/buffer -"
-meta-jmeta-l = "/buffer +"
-meta-jmeta-r = "/server raw"
-meta-jmeta-s = "/server jump"
-meta-j01 = "/buffer *1"
-meta-j02 = "/buffer *2"
-meta-j03 = "/buffer *3"
-meta-j04 = "/buffer *4"
-meta-j05 = "/buffer *5"
-meta-j06 = "/buffer *6"
-meta-j07 = "/buffer *7"
-meta-j08 = "/buffer *8"
-meta-j09 = "/buffer *9"
-meta-j10 = "/buffer *10"
-meta-j11 = "/buffer *11"
-meta-j12 = "/buffer *12"
-meta-j13 = "/buffer *13"
-meta-j14 = "/buffer *14"
-meta-j15 = "/buffer *15"
-meta-j16 = "/buffer *16"
-meta-j17 = "/buffer *17"
-meta-j18 = "/buffer *18"
-meta-j19 = "/buffer *19"
-meta-j20 = "/buffer *20"
-meta-j21 = "/buffer *21"
-meta-j22 = "/buffer *22"
-meta-j23 = "/buffer *23"
-meta-j24 = "/buffer *24"
-meta-j25 = "/buffer *25"
-meta-j26 = "/buffer *26"
-meta-j27 = "/buffer *27"
-meta-j28 = "/buffer *28"
-meta-j29 = "/buffer *29"
-meta-j30 = "/buffer *30"
-meta-j31 = "/buffer *31"
-meta-j32 = "/buffer *32"
-meta-j33 = "/buffer *33"
-meta-j34 = "/buffer *34"
-meta-j35 = "/buffer *35"
-meta-j36 = "/buffer *36"
-meta-j37 = "/buffer *37"
-meta-j38 = "/buffer *38"
-meta-j39 = "/buffer *39"
-meta-j40 = "/buffer *40"
-meta-j41 = "/buffer *41"
-meta-j42 = "/buffer *42"
-meta-j43 = "/buffer *43"
-meta-j44 = "/buffer *44"
-meta-j45 = "/buffer *45"
-meta-j46 = "/buffer *46"
-meta-j47 = "/buffer *47"
-meta-j48 = "/buffer *48"
-meta-j49 = "/buffer *49"
-meta-j50 = "/buffer *50"
-meta-j51 = "/buffer *51"
-meta-j52 = "/buffer *52"
-meta-j53 = "/buffer *53"
-meta-j54 = "/buffer *54"
-meta-j55 = "/buffer *55"
-meta-j56 = "/buffer *56"
-meta-j57 = "/buffer *57"
-meta-j58 = "/buffer *58"
-meta-j59 = "/buffer *59"
-meta-j60 = "/buffer *60"
-meta-j61 = "/buffer *61"
-meta-j62 = "/buffer *62"
-meta-j63 = "/buffer *63"
-meta-j64 = "/buffer *64"
-meta-j65 = "/buffer *65"
-meta-j66 = "/buffer *66"
-meta-j67 = "/buffer *67"
-meta-j68 = "/buffer *68"
-meta-j69 = "/buffer *69"
-meta-j70 = "/buffer *70"
-meta-j71 = "/buffer *71"
-meta-j72 = "/buffer *72"
-meta-j73 = "/buffer *73"
-meta-j74 = "/buffer *74"
-meta-j75 = "/buffer *75"
-meta-j76 = "/buffer *76"
-meta-j77 = "/buffer *77"
-meta-j78 = "/buffer *78"
-meta-j79 = "/buffer *79"
-meta-j80 = "/buffer *80"
-meta-j81 = "/buffer *81"
-meta-j82 = "/buffer *82"
-meta-j83 = "/buffer *83"
-meta-j84 = "/buffer *84"
-meta-j85 = "/buffer *85"
-meta-j86 = "/buffer *86"
-meta-j87 = "/buffer *87"
-meta-j88 = "/buffer *88"
-meta-j89 = "/buffer *89"
-meta-j90 = "/buffer *90"
-meta-j91 = "/buffer *91"
-meta-j92 = "/buffer *92"
-meta-j93 = "/buffer *93"
-meta-j94 = "/buffer *94"
-meta-j95 = "/buffer *95"
-meta-j96 = "/buffer *96"
-meta-j97 = "/buffer *97"
-meta-j98 = "/buffer *98"
-meta-j99 = "/buffer *99"
-meta-k = "/input grab_key_command"
-meta-l = "/window bare"
-meta-m = "/mute mouse toggle"
-meta-n = "/window scroll_next_highlight"
-meta-p = "/window scroll_previous_highlight"
-meta-r = "/input delete_line"
-meta-s = "/mute aspell toggle"
-meta-u = "/window scroll_unread"
-meta-wmeta-meta2-A = "/window up"
-meta-wmeta-meta2-B = "/window down"
-meta-wmeta-meta2-C = "/window right"
-meta-wmeta-meta2-D = "/window left"
-meta-wmeta2-1;3A = "/window up"
-meta-wmeta2-1;3B = "/window down"
-meta-wmeta2-1;3C = "/window right"
-meta-wmeta2-1;3D = "/window left"
-meta-wmeta-b = "/window balance"
-meta-wmeta-s = "/window swap"
-meta-x = "/input zoom_merged_buffer"
-meta-z = "/window zoom"
-ctrl-_ = "/input undo"
-
-[key_search]
-ctrl-I = "/input search_switch_where"
-ctrl-J = "/input search_stop_here"
-ctrl-M = "/input search_stop_here"
-ctrl-Q = "/input search_stop"
-ctrl-R = "/input search_switch_regex"
-meta2-A = "/input search_previous"
-meta2-B = "/input search_next"
-meta-c = "/input search_switch_case"
-
-[key_cursor]
-ctrl-J = "/cursor stop"
-ctrl-M = "/cursor stop"
-meta-meta2-A = "/cursor move area_up"
-meta-meta2-B = "/cursor move area_down"
-meta-meta2-C = "/cursor move area_right"
-meta-meta2-D = "/cursor move area_left"
-meta2-1;3A = "/cursor move area_up"
-meta2-1;3B = "/cursor move area_down"
-meta2-1;3C = "/cursor move area_right"
-meta2-1;3D = "/cursor move area_left"
-meta2-A = "/cursor move up"
-meta2-B = "/cursor move down"
-meta2-C = "/cursor move right"
-meta2-D = "/cursor move left"
-@item(buffer_nicklist):K = "/window ${_window_number};/kickban ${nick}"
-@item(buffer_nicklist):b = "/window ${_window_number};/ban ${nick}"
-@item(buffer_nicklist):k = "/window ${_window_number};/kick ${nick}"
-@item(buffer_nicklist):q = "/window ${_window_number};/query ${nick};/cursor stop"
-@item(buffer_nicklist):w = "/window ${_window_number};/whois ${nick}"
-@chat:Q = "hsignal:chat_quote_time_prefix_message;/cursor stop"
-@chat:m = "hsignal:chat_quote_message;/cursor stop"
-@chat:q = "hsignal:chat_quote_prefix_message;/cursor stop"
-
-[key_mouse]
-@bar(buflist):ctrl-wheeldown = "hsignal:buflist_mouse"
-@bar(buflist):ctrl-wheelup = "hsignal:buflist_mouse"
-@bar(input):button2 = "/input grab_mouse_area"
-@bar(nicklist):button1-gesture-down = "/bar scroll nicklist ${_window_number} +100%"
-@bar(nicklist):button1-gesture-down-long = "/bar scroll nicklist ${_window_number} e"
-@bar(nicklist):button1-gesture-up = "/bar scroll nicklist ${_window_number} -100%"
-@bar(nicklist):button1-gesture-up-long = "/bar scroll nicklist ${_window_number} b"
-@chat(perl.iset):button1 = "hsignal:iset_mouse"
-@chat(perl.iset):button2* = "hsignal:iset_mouse"
-@chat(perl.iset):wheeldown = "/repeat 5 /iset **down"
-@chat(perl.iset):wheelup = "/repeat 5 /iset **up"
-@chat(script.scripts):button1 = "/window ${_window_number};/script go ${_chat_line_y}"
-@chat(script.scripts):button2 = "/window ${_window_number};/script go ${_chat_line_y};/script installremove -q ${script_name_with_extension}"
-@chat(script.scripts):wheeldown = "/script down 5"
-@chat(script.scripts):wheelup = "/script up 5"
-@item(buffer_nicklist):button1 = "/window ${_window_number};/query ${nick}"
-@item(buffer_nicklist):button1-gesture-left = "/window ${_window_number};/kick ${nick}"
-@item(buffer_nicklist):button1-gesture-left-long = "/window ${_window_number};/kickban ${nick}"
-@item(buffer_nicklist):button2 = "/window ${_window_number};/whois ${nick}"
-@item(buffer_nicklist):button2-gesture-left = "/window ${_window_number};/ban ${nick}"
-@item(buflist):button1* = "hsignal:buflist_mouse"
-@item(buflist):button2* = "hsignal:buflist_mouse"
-@bar:wheeldown = "/bar scroll ${_bar_name} ${_window_number} +20%"
-@bar:wheelup = "/bar scroll ${_bar_name} ${_window_number} -20%"
-@chat:button1 = "/window ${_window_number}"
-@chat:button1-gesture-left = "/window ${_window_number};/buffer -1"
-@chat:button1-gesture-left-long = "/window ${_window_number};/buffer 1"
-@chat:button1-gesture-right = "/window ${_window_number};/buffer +1"
-@chat:button1-gesture-right-long = "/window ${_window_number};/input jump_last_buffer"
-@chat:ctrl-wheeldown = "/window scroll_horiz -window ${_window_number} +10%"
-@chat:ctrl-wheelup = "/window scroll_horiz -window ${_window_number} -10%"
-@chat:wheeldown = "/window scroll_down -window ${_window_number}"
-@chat:wheelup = "/window scroll_up -window ${_window_number}"
-@*:button3 = "/cursor go ${_x},${_y}"
diff --git a/.weechat/xfer.conf b/.weechat/xfer.conf
deleted file mode 100644
index c7ef6022..00000000
--- a/.weechat/xfer.conf
+++ /dev/null
@@ -1,46 +0,0 @@
-#
-# weechat -- xfer.conf
-#
-# WARNING: It is NOT recommended to edit this file by hand,
-# especially if WeeChat is running.
-#
-# Use /set or similar command to change settings in WeeChat.
-#
-# For more info, see: https://weechat.org/doc/quickstart
-#
-
-[look]
-auto_open_buffer = on
-progress_bar_size = 20
-pv_tags = "notify_private"
-
-[color]
-status_aborted = lightred
-status_active = lightblue
-status_connecting = yellow
-status_done = lightgreen
-status_failed = lightred
-status_waiting = lightcyan
-text = default
-text_bg = default
-text_selected = white
-
-[network]
-blocksize = 65536
-fast_send = on
-own_ip = ""
-port_range = ""
-speed_limit = 0
-timeout = 300
-
-[file]
-auto_accept_chats = off
-auto_accept_files = off
-auto_accept_nicks = ""
-auto_check_crc32 = off
-auto_rename = on
-auto_resume = on
-convert_spaces = on
-download_path = "%h/xfer"
-upload_path = "~"
-use_nick_in_filename = on