changeset 259:726728f13152

More Weechat plugins and config.
author Ludovic Chabant <ludovic@chabant.com>
date Wed, 21 Jan 2015 16:45:26 -0800
parents abb94e9f28d2
children f3ea51b9b4d1
files weechat/buffers.conf weechat/exec.conf weechat/iset.conf weechat/perl/autoload/buffers.pl weechat/perl/autoload/iset.pl weechat/perl/autoload/pushover.pl weechat/perl/buffers.pl weechat/perl/iset.pl weechat/perl/pushover.pl weechat/plugins.conf weechat/sec.conf weechat/trigger.conf weechat/weechat.conf
diffstat 13 files changed, 3802 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/weechat/buffers.conf	Wed Jan 21 16:45:26 2015 -0800
@@ -0,0 +1,71 @@
+#
+# buffers.conf -- weechat v0.4.2
+#
+
+[color]
+current_bg = red
+current_fg = lightcyan
+default_bg = default
+default_fg = default
+hotlist_highlight_bg = default
+hotlist_highlight_fg = magenta
+hotlist_low_bg = default
+hotlist_low_fg = white
+hotlist_message_bg = default
+hotlist_message_fg = yellow
+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 = 0
+detach_buffer_immediately = ""
+detach_display_window_number = off
+detach_displayed_buffers = on
+detach_free_content = off
+detach_query = off
+hide_merged_buffers = none
+hotlist_counter = off
+immune_detach_buffers = ""
+indenting = off
+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 = ""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/weechat/exec.conf	Wed Jan 21 16:45:26 2015 -0800
@@ -0,0 +1,11 @@
+#
+# exec.conf -- weechat v1.1
+#
+
+[command]
+default_options = ""
+purge_delay = 0
+
+[color]
+flag_finished = lightred
+flag_running = lightgreen
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/weechat/iset.conf	Wed Jan 21 16:45:26 2015 -0800
@@ -0,0 +1,30 @@
+#
+# iset.conf -- weechat v0.4.2
+#
+
+[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 = "="
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/weechat/perl/autoload/buffers.pl	Wed Jan 21 16:45:26 2015 -0800
@@ -0,0 +1,1 @@
+../buffers.pl
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/weechat/perl/autoload/iset.pl	Wed Jan 21 16:45:26 2015 -0800
@@ -0,0 +1,1 @@
+../iset.pl
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/weechat/perl/autoload/pushover.pl	Wed Jan 21 16:45:26 2015 -0800
@@ -0,0 +1,1 @@
+../pushover.pl
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/weechat/perl/buffers.pl	Wed Jan 21 16:45:26 2015 -0800
@@ -0,0 +1,1788 @@
+#
+# Copyright (C) 2008-2014 Sebastien Helleu <flashcode@flashtux.org>
+# Copyright (C) 2011-2013 Nils G <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/>.
+#
+#
+# Display sidebar with list of buffers.
+#
+# History:
+#
+# 2014-12-12
+#     v5.0: fix cropping non-latin buffer names
+# 2014-08-29, Patrick Steinhardt <ps@pks.im>:
+#     v4.9: add support for specifying custom buffer names
+# 2014-07-19, Sebastien Helleu <flashcode@flashtux.org>:
+#     v4.8: add support of ctrl + mouse wheel to jump to previous/next buffer,
+#           new option "mouse_wheel"
+# 2014-06-22, Sebastien Helleu <flashcode@flashtux.org>:
+#     v4.7: fix typos in options
+# 2014-04-05, Sebastien Helleu <flashcode@flashtux.org>:
+#     v4.6: add support of hidden buffers (WeeChat >= 0.4.4)
+# 2014-01-01, Sebastien Helleu <flashcode@flashtux.org>:
+#     v4.5: add option "mouse_move_buffer"
+# 2013-12-11, Sebastien Helleu <flashcode@flashtux.org>:
+#     v4.4: fix buffer number on drag to the end of list when option
+#           weechat.look.buffer_auto_renumber is off
+# 2013-12-10, nils_2@freenode.#weechat:
+#     v4.3: add options "prefix_bufname" and "suffix_bufname (idea by silverd)
+#         : fix hook_timer() for show_lag wasn't disabled
+#         : improved signal handling (less updating of buffers list)
+# 2013-11-07, Sebastien Helleu <flashcode@flashtux.org>:
+#     v4.2: use default filling "columns_vertical" when bar position is top/bottom
+# 2013-10-31, nils_2@freenode.#weechat:
+#     v4.1: add option "detach_buffer_immediately" (idea by farn)
+# 2013-10-20, nils_2@freenode.#weechat:
+#     v4.0: add options "detach_displayed_buffers", "detach_display_window_number"
+# 2013-09-27, nils_2@freenode.#weechat:
+#     v3.9: add option "toggle_bar" and option "show_prefix_query" (idea by IvarB)
+#         : fix problem with linefeed at end of list of buffers (reported by grawity)
+# 2012-10-18, nils_2@freenode.#weechat:
+#     v3.8: add option "mark_inactive", to mark buffers you are not in (idea by xrdodrx)
+#         : add wildcard "*" for immune_detach_buffers (idea by StarWeaver)
+#         : add new options "detach_query" and "detach_free_content" (idea by StarWeaver)
+# 2012-10-06, Nei <anti.teamidiot.de>:
+#     v3.7: call menu on right mouse if menu script is loaded.
+# 2012-10-06, nils_2 <weechatter@arcor.de>:
+#     v3.6: add new option "hotlist_counter" (idea by torque).
+# 2012-06-02, nils_2 <weechatter@arcor.de>:
+#     v3.5: add values "server|channel|private|all|keepserver|none" to option "hide_merged_buffers" (suggested by dominikh).
+# 2012-05-25, nils_2 <weechatter@arcor.de>:
+#     v3.4: add new option "show_lag".
+# 2012-04-07, Sebastien Helleu <flashcode@flashtux.org>:
+#     v3.3: fix truncation of wide chars in buffer name (option name_size_max) (bug #36034)
+# 2012-03-15, nils_2 <weechatter@arcor.de>:
+#     v3.2: add new option "detach"(weechat >= 0.3.8)
+#           add new option "immune_detach_buffers" (requested by Mkaysi)
+#           add new function buffers_whitelist add|del|reset (suggested by FiXato)
+#           add new function buffers_detach add|del|reset
+# 2012-03-09, Sebastien Helleu <flashcode@flashtux.org>:
+#     v3.1: fix reload of config file
+# 2012-01-29, nils_2 <weechatter@arcor.de>:
+#     v3.0: fix: buffers did not update directly during window_switch (reported by FiXato)
+# 2012-01-29, nils_2 <weechatter@arcor.de>:
+#     v2.9: add options "name_size_max" and "name_crop_suffix"
+# 2012-01-08, nils_2 <weechatter@arcor.de>:
+#     v2.8: fix indenting for option "show_number off"
+#           fix unset of buffer activity in hotlist when buffer was moved with mouse
+#           add buffer with free content and core buffer sorted first (suggested  by nyuszika7h)
+#           add options queries_default_fg/bg and queries_message_fg/bg (suggested by FiXato)
+#           add clicking with left button on current buffer will do a jump_previously_visited_buffer (suggested by FiXato)
+#           add clicking with right button on current buffer will do a jump_next_visited_buffer
+#           add additional informations in help texts
+#           add default_fg and default_bg for whitelist channels
+#           internal changes  (script is now 3Kb smaller)
+# 2012-01-04, Sebastien Helleu <flashcode@flashtux.org>:
+#     v2.7: fix regex lookup in whitelist buffers list
+# 2011-12-04, nils_2 <weechatter@arcor.de>:
+#     v2.6: add own config file (buffers.conf)
+#           add new behavior for indenting (under_name)
+#           add new option to set different color for server buffers and buffers with free content
+# 2011-10-30, nils_2 <weechatter@arcor.de>:
+#     v2.5: add new options "show_number_char" and "color_number_char",
+#           add help-description for options
+# 2011-08-24, Sebastien Helleu <flashcode@flashtux.org>:
+#     v2.4: add mouse support
+# 2011-06-06, nils_2 <weechatter@arcor.de>:
+#     v2.3: added: missed option "color_whitelist_default"
+# 2011-03-23, Sebastien Helleu <flashcode@flashtux.org>:
+#     v2.2: fix color of nick prefix with WeeChat >= 0.3.5
+# 2011-02-13, nils_2 <weechatter@arcor.de>:
+#     v2.1: add options "color_whitelist_*"
+# 2010-10-05, Sebastien Helleu <flashcode@flashtux.org>:
+#     v2.0: add options "sort" and "show_number"
+# 2010-04-12, Sebastien Helleu <flashcode@flashtux.org>:
+#     v1.9: replace call to log() by length() to align buffer numbers
+# 2010-04-02, Sebastien Helleu <flashcode@flashtux.org>:
+#     v1.8: fix bug with background color and option indenting_number
+# 2010-04-02, Helios <helios@efemes.de>:
+#     v1.7: add indenting_number option
+# 2010-02-25, m4v <lambdae2@gmail.com>:
+#     v1.6: add option to hide empty prefixes
+# 2010-02-12, Sebastien Helleu <flashcode@flashtux.org>:
+#     v1.5: add optional nick prefix for buffers like IRC channels
+# 2009-09-30, Sebastien Helleu <flashcode@flashtux.org>:
+#     v1.4: remove spaces for indenting when bar position is top/bottom
+# 2009-06-14, Sebastien Helleu <flashcode@flashtux.org>:
+#     v1.3: add option "hide_merged_buffers"
+# 2009-06-14, Sebastien Helleu <flashcode@flashtux.org>:
+#     v1.2: improve display with merged buffers
+# 2009-05-02, Sebastien Helleu <flashcode@flashtux.org>:
+#     v1.1: sync with last API changes
+# 2009-02-21, Sebastien Helleu <flashcode@flashtux.org>:
+#     v1.0: remove timer used to update bar item first time (not needed any more)
+# 2009-02-17, Sebastien Helleu <flashcode@flashtux.org>:
+#     v0.9: fix bug with indenting of private buffers
+# 2009-01-04, Sebastien Helleu <flashcode@flashtux.org>:
+#     v0.8: update syntax for command /set (comments)
+# 2008-10-20, Jiri Golembiovsky <golemj@gmail.com>:
+#     v0.7: add indenting option
+# 2008-10-01, Sebastien Helleu <flashcode@flashtux.org>:
+#     v0.6: add default color for buffers, and color for current active buffer
+# 2008-09-18, Sebastien Helleu <flashcode@flashtux.org>:
+#     v0.5: fix color for "low" level entry in hotlist
+# 2008-09-18, Sebastien Helleu <flashcode@flashtux.org>:
+#     v0.4: rename option "show_category" to "short_names",
+#           remove option "color_slash"
+# 2008-09-15, Sebastien Helleu <flashcode@flashtux.org>:
+#     v0.3: fix bug with priority in hotlist (var not defined)
+# 2008-09-02, Sebastien Helleu <flashcode@flashtux.org>:
+#     v0.2: add color for buffers with activity and config options for
+#           colors, add config option to display/hide categories
+# 2008-03-15, Sebastien Helleu <flashcode@flashtux.org>:
+#     v0.1: script creation
+#
+# Help about settings:
+#   display all settings for script (or use iset.pl script to change settings):
+#      /set buffers*
+#   show help text for option buffers.look.whitelist_buffers:
+#      /help buffers.look.whitelist_buffers
+#
+# Mouse-support (standard key bindings):
+#   left mouse-button:
+#       - click on a buffer to switch to selected buffer
+#       - click on current buffer will do action jump_previously_visited_buffer
+#       - drag a buffer and drop it on another position will move the buffer to position
+#   right mouse-button:
+#       - click on current buffer will do action jump_next_visited_buffer
+#       - moving buffer to the left/right will close buffer.
+#
+
+use strict;
+use Encode qw( decode encode );
+# -----------------------------[ internal ]-------------------------------------
+my $SCRIPT_NAME = "buffers";
+my $SCRIPT_VERSION = "5.0";
+
+my $BUFFERS_CONFIG_FILE_NAME = "buffers";
+my $buffers_config_file;
+my $cmd_buffers_whitelist= "buffers_whitelist";
+my $cmd_buffers_detach   = "buffers_detach";
+
+my %mouse_keys = ("\@item(buffers):button1*" => "hsignal:buffers_mouse",
+                  "\@item(buffers):button2*" => "hsignal:buffers_mouse",
+                  "\@bar(buffers):ctrl-wheelup" => "hsignal:buffers_mouse",
+                  "\@bar(buffers):ctrl-wheeldown" => "hsignal:buffers_mouse");
+my %options;
+my %hotlist_level = (0 => "low", 1 => "message", 2 => "private", 3 => "highlight");
+my @whitelist_buffers = ();
+my @immune_detach_buffers= ();
+my @detach_buffer_immediately= ();
+my @buffers_focus = ();
+my %buffers_timer = ();
+my %Hooks = ();
+
+# --------------------------------[ init ]--------------------------------------
+weechat::register($SCRIPT_NAME, "Sebastien Helleu <flashcode\@flashtux.org>",
+                  $SCRIPT_VERSION, "GPL3",
+                  "Sidebar with list of buffers", "shutdown_cb", "");
+my $weechat_version = weechat::info_get("version_number", "") || 0;
+
+buffers_config_init();
+buffers_config_read();
+
+weechat::bar_item_new($SCRIPT_NAME, "build_buffers", "");
+weechat::bar_new($SCRIPT_NAME, "0", "0", "root", "", "left", "columns_vertical",
+                 "vertical", "0", "0", "default", "default", "default", "1",
+                 $SCRIPT_NAME);
+
+if ( check_bar_item() == 0 )
+{
+    weechat::command("", "/bar show " . $SCRIPT_NAME) if ( weechat::config_boolean($options{"toggle_bar"}) eq 1 );
+}
+
+weechat::hook_signal("buffer_opened", "buffers_signal_buffer", "");
+weechat::hook_signal("buffer_closed", "buffers_signal_buffer", "");
+weechat::hook_signal("buffer_merged", "buffers_signal_buffer", "");
+weechat::hook_signal("buffer_unmerged", "buffers_signal_buffer", "");
+weechat::hook_signal("buffer_moved", "buffers_signal_buffer", "");
+weechat::hook_signal("buffer_renamed", "buffers_signal_buffer", "");
+weechat::hook_signal("buffer_switch", "buffers_signal_buffer", "");
+weechat::hook_signal("buffer_hidden", "buffers_signal_buffer", "");  # WeeChat >= 0.4.4
+weechat::hook_signal("buffer_unhidden", "buffers_signal_buffer", "");  # WeeChat >= 0.4.4
+weechat::hook_signal("buffer_localvar_added", "buffers_signal_buffer", "");
+weechat::hook_signal("buffer_localvar_changed", "buffers_signal_buffer", "");
+
+weechat::hook_signal("window_switch", "buffers_signal_buffer", "");
+weechat::hook_signal("hotlist_changed", "buffers_signal_hotlist", "");
+#weechat::hook_command_run("/input switch_active_*", "buffers_signal_buffer", "");
+weechat::bar_item_update($SCRIPT_NAME);
+
+
+if ($weechat_version >= 0x00030600)
+{
+    weechat::hook_focus($SCRIPT_NAME, "buffers_focus_buffers", "");
+    weechat::hook_hsignal("buffers_mouse", "buffers_hsignal_mouse", "");
+    weechat::key_bind("mouse", \%mouse_keys);
+}
+
+weechat::hook_command($cmd_buffers_whitelist,
+                      "add/del current buffer to/from buffers whitelist",
+                      "[add] || [del] || [reset]",
+                      "  add: add current buffer in configuration file\n".
+                      "  del: delete current buffer from configuration file\n".
+                      "reset: reset all buffers from configuration file ".
+                      "(no confirmation!)\n\n".
+                      "Examples:\n".
+                      "/$cmd_buffers_whitelist add\n",
+                      "add %-||".
+                      "del %-||".
+                      "reset %-",
+                      "buffers_cmd_whitelist", "");
+weechat::hook_command($cmd_buffers_detach,
+                      "add/del current buffer to/from buffers detach",
+                      "[add] || [del] || [reset]",
+                      "  add: add current buffer in configuration file\n".
+                      "  del: delete current buffer from configuration file\n".
+                      "reset: reset all buffers from configuration file ".
+                      "(no confirmation!)\n\n".
+                      "Examples:\n".
+                      "/$cmd_buffers_detach add\n",
+                      "add %-||".
+                      "del %-||".
+                      "reset %-",
+                      "buffers_cmd_detach", "");
+
+if ($weechat_version >= 0x00030800)
+{
+    weechat::hook_config("buffers.look.detach", "hook_timer_detach", "");
+    if (weechat::config_integer($options{"detach"}) > 0)
+    {
+        $Hooks{timer_detach} = weechat::hook_timer(weechat::config_integer($options{"detach"}) * 1000,
+                                                   60, 0, "buffers_signal_hotlist", "");
+    }
+}
+
+weechat::hook_config("buffers.look.show_lag", "hook_timer_lag", "");
+
+if (weechat::config_boolean($options{"show_lag"}))
+{
+    $Hooks{timer_lag} = weechat::hook_timer(
+        weechat::config_integer(weechat::config_get("irc.network.lag_refresh_interval")) * 1000,
+        0, 0, "buffers_signal_hotlist", "");
+}
+
+# -------------------------------- [ command ] --------------------------------
+sub buffers_cmd_whitelist
+{
+my ( $data, $buffer, $args ) = @_;
+    $args = lc($args);
+    my $buffers_whitelist = weechat::config_string( weechat::config_get("buffers.look.whitelist_buffers") );
+    return weechat::WEECHAT_RC_OK if ( $buffers_whitelist eq "" and $args eq "del" or $buffers_whitelist eq "" and $args eq "reset" );
+    my @buffers_list = split( /,/, $buffers_whitelist );
+    # get buffers name
+    my $infolist = weechat::infolist_get("buffer", weechat::current_buffer(), "");
+    weechat::infolist_next($infolist);
+    my $buffers_name = weechat::infolist_string($infolist, "name");
+    weechat::infolist_free($infolist);
+    return weechat::WEECHAT_RC_OK if ( $buffers_name eq "" );                   # should never happen
+
+    if ( $args eq "add" )
+    {
+        return weechat::WEECHAT_RC_OK if ( grep /^$buffers_name$/, @buffers_list );     # check if buffer already in list
+        push @buffers_list, ( $buffers_name );
+        my $buffers_list = &create_whitelist(\@buffers_list);
+        weechat::config_option_set( weechat::config_get("buffers.look.whitelist_buffers"), $buffers_list, 1);
+        weechat::print(weechat::current_buffer(), "buffer \"$buffers_name\" added to buffers whitelist");
+    }
+    elsif ( $args eq "del" )
+    {
+        return weechat::WEECHAT_RC_OK unless ( grep /^$buffers_name$/, @buffers_list );     # check if buffer is in list
+        @buffers_list = grep {$_ ne $buffers_name} @buffers_list;                           # delete entry
+        my $buffers_list = &create_whitelist(\@buffers_list);
+        weechat::config_option_set( weechat::config_get("buffers.look.whitelist_buffers"), $buffers_list, 1);
+        weechat::print(weechat::current_buffer(), "buffer \"$buffers_name\" deleted from buffers whitelist");
+    }
+    elsif ( $args eq "reset" )
+    {
+        return weechat::WEECHAT_RC_OK if ( $buffers_whitelist eq "" );
+        weechat::config_option_set( weechat::config_get("buffers.look.whitelist_buffers"), "", 1);
+        weechat::print(weechat::current_buffer(), "buffers whitelist is empty, now...");
+    }
+    return weechat::WEECHAT_RC_OK;
+}
+sub buffers_cmd_detach
+{
+    my ( $data, $buffer, $args ) = @_;
+    $args = lc($args);
+    my $immune_detach_buffers = weechat::config_string( weechat::config_get("buffers.look.immune_detach_buffers") );
+    return weechat::WEECHAT_RC_OK if ( $immune_detach_buffers eq "" and $args eq "del" or $immune_detach_buffers eq "" and $args eq "reset" );
+
+    my @buffers_list = split( /,/, $immune_detach_buffers );
+    # get buffers name
+    my $infolist = weechat::infolist_get("buffer", weechat::current_buffer(), "");
+    weechat::infolist_next($infolist);
+    my $buffers_name = weechat::infolist_string($infolist, "name");
+    weechat::infolist_free($infolist);
+    return weechat::WEECHAT_RC_OK if ( $buffers_name eq "" );                   # should never happen
+
+    if ( $args eq "add" )
+    {
+        return weechat::WEECHAT_RC_OK if ( grep /^$buffers_name$/, @buffers_list );     # check if buffer already in list
+        push @buffers_list, ( $buffers_name );
+        my $buffers_list = &create_whitelist(\@buffers_list);
+        weechat::config_option_set( weechat::config_get("buffers.look.immune_detach_buffers"), $buffers_list, 1);
+        weechat::print(weechat::current_buffer(), "buffer \"$buffers_name\" added to immune detach buffers");
+    }
+    elsif ( $args eq "del" )
+    {
+        return weechat::WEECHAT_RC_OK unless ( grep /^$buffers_name$/, @buffers_list );     # check if buffer is in list
+        @buffers_list = grep {$_ ne $buffers_name} @buffers_list;                           # delete entry
+        my $buffers_list = &create_whitelist(\@buffers_list);
+        weechat::config_option_set( weechat::config_get("buffers.look.immune_detach_buffers"), $buffers_list, 1);
+        weechat::print(weechat::current_buffer(), "buffer \"$buffers_name\" deleted from immune detach buffers");
+    }
+    elsif ( $args eq "reset" )
+    {
+        return weechat::WEECHAT_RC_OK if ( $immune_detach_buffers eq "" );
+        weechat::config_option_set( weechat::config_get("buffers.look.immune_detach_buffers"), "", 1);
+        weechat::print(weechat::current_buffer(), "immune detach buffers is empty, now...");
+    }
+    return weechat::WEECHAT_RC_OK;
+}
+
+sub create_whitelist
+{
+    my @buffers_list = @{$_[0]};
+    my $buffers_list = "";
+        foreach (@buffers_list)
+        {
+            $buffers_list .= $_ .",";
+        }
+        # remove last ","
+        chop $buffers_list;
+    return $buffers_list;
+}
+
+# -------------------------------- [ config ] --------------------------------
+sub hook_timer_detach
+{
+    my $detach = $_[2];
+    if ( $detach eq 0 )
+    {
+        weechat::unhook($Hooks{timer_detach}) if $Hooks{timer_detach};
+        $Hooks{timer_detach} = "";
+    }
+    else
+    {
+        weechat::unhook($Hooks{timer_detach}) if $Hooks{timer_detach};
+        $Hooks{timer_detach} = weechat::hook_timer( weechat::config_integer( $options{"detach"}) * 1000, 60, 0, "buffers_signal_hotlist", "");
+    }
+    weechat::bar_item_update($SCRIPT_NAME);
+    return weechat::WEECHAT_RC_OK;
+}
+
+sub hook_timer_lag
+{
+    my $lag = $_[2];
+    if ( $lag eq "off" )
+    {
+        weechat::unhook($Hooks{timer_lag}) if $Hooks{timer_lag};
+        $Hooks{timer_lag} = "";
+    }
+    else
+    {
+        weechat::unhook($Hooks{timer_lag}) if $Hooks{timer_lag};
+        $Hooks{timer_lag} = weechat::hook_timer( weechat::config_integer(weechat::config_get("irc.network.lag_refresh_interval")) * 1000, 0, 0, "buffers_signal_hotlist", "");
+    }
+    weechat::bar_item_update($SCRIPT_NAME);
+    return weechat::WEECHAT_RC_OK;
+}
+
+sub buffers_config_read
+{
+    return weechat::config_read($buffers_config_file) if ($buffers_config_file ne "");
+}
+sub buffers_config_write
+{
+    return weechat::config_write($buffers_config_file) if ($buffers_config_file ne "");
+}
+sub buffers_config_reload_cb
+{
+    my ($data, $config_file) = ($_[0], $_[1]);
+    return weechat::config_reload($config_file)
+}
+sub buffers_config_init
+{
+    $buffers_config_file = weechat::config_new($BUFFERS_CONFIG_FILE_NAME,
+                                               "buffers_config_reload_cb", "");
+    return if ($buffers_config_file eq "");
+
+my %default_options_color =
+("color_current_fg" => [
+     "current_fg", "color",
+     "foreground color for current buffer",
+     "", 0, 0, "lightcyan", "lightcyan", 0,
+     "", "", "buffers_signal_config", "", "", ""
+ ],
+ "color_current_bg" => [
+     "current_bg", "color",
+     "background color for current buffer",
+     "", 0, 0, "red", "red", 0,
+     "", "", "buffers_signal_config", "", "", ""
+ ],
+ "color_default_fg" => [
+     "default_fg", "color",
+     "default foreground color for buffer name",
+     "", 0, 0, "default", "default", 0,
+     "", "", "buffers_signal_config", "", "", ""
+ ],
+ "color_default_bg" => [
+     "default_bg", "color",
+     "default background color for buffer name",
+     "", 0, 0, "default", "default", 0,
+     "", "", "buffers_signal_config", "", "", ""
+ ],
+ "color_hotlist_highlight_fg" => [
+     "hotlist_highlight_fg", "color",
+     "change foreground color of buffer name if a highlight messaged received",
+     "", 0, 0, "magenta", "magenta", 0,
+     "", "", "buffers_signal_config", "", "", ""
+ ],
+ "color_hotlist_highlight_bg" => [
+     "hotlist_highlight_bg", "color",
+     "change background color of buffer name if a highlight messaged received",
+     "", 0, 0, "default", "default", 0,
+     "", "", "buffers_signal_config", "", "", ""
+ ],
+ "color_hotlist_low_fg" => [
+     "hotlist_low_fg", "color",
+     "change foreground color of buffer name if a low message received",
+     "", 0, 0, "white", "white", 0,
+     "", "", "buffers_signal_config", "", "", ""
+ ],
+ "color_hotlist_low_bg" => [
+     "hotlist_low_bg", "color",
+     "change background color of buffer name if a low message received",
+     "", 0, 0, "default", "default", 0,
+     "", "", "buffers_signal_config", "", "", ""
+ ],
+ "color_hotlist_message_fg" => [
+     "hotlist_message_fg", "color",
+     "change foreground color of buffer name if a normal message received",
+     "", 0, 0, "yellow", "yellow", 0,
+     "", "", "buffers_signal_config", "", "", ""
+ ],
+ "color_hotlist_message_bg" => [
+     "hotlist_message_bg", "color",
+     "change background color of buffer name if a normal message received",
+     "", 0, 0, "default", "default", 0,
+     "", "", "buffers_signal_config", "", "", ""
+ ],
+ "color_hotlist_private_fg" => [
+     "hotlist_private_fg", "color",
+     "change foreground color of buffer name if a private message received",
+     "", 0, 0, "lightgreen", "lightgreen", 0,
+     "", "", "buffers_signal_config", "", "", ""
+ ],
+ "color_hotlist_private_bg" => [
+     "hotlist_private_bg", "color",
+     "change background color of buffer name if a private message received",
+     "", 0, 0, "default", "default", 0,
+     "", "", "buffers_signal_config", "", "", ""
+ ],
+ "color_number" => [
+     "number", "color",
+     "color for buffer number",
+     "", 0, 0, "lightgreen", "lightgreen", 0,
+     "", "", "buffers_signal_config", "", "", ""
+ ],
+ "color_number_char" => [
+     "number_char", "color",
+     "color for buffer number char",
+     "", 0, 0, "lightgreen", "lightgreen", 0,
+     "", "", "buffers_signal_config", "", "", ""
+ ],
+ "color_whitelist_default_fg" => [
+     "whitelist_default_fg", "color",
+     "default foreground color for whitelist buffer name",
+     "", 0, 0, "", "", 0,
+     "", "", "buffers_signal_config", "", "", ""
+ ],
+ "color_whitelist_default_bg" => [
+     "whitelist_default_bg", "color",
+     "default background color for whitelist buffer name",
+     "", 0, 0, "", "", 0,
+     "", "", "buffers_signal_config", "", "", ""
+ ],
+ "color_whitelist_low_fg" => [
+     "whitelist_low_fg", "color",
+     "low color of whitelist buffer name",
+     "", 0, 0, "", "", 0,
+     "", "", "buffers_signal_config", "", "", ""
+ ],
+ "color_whitelist_low_bg" => [
+     "whitelist_low_bg", "color",
+     "low color of whitelist buffer name",
+     "", 0, 0, "", "", 0,
+     "", "", "buffers_signal_config", "", "", ""
+ ],
+ "color_whitelist_message_fg" => [
+     "whitelist_message_fg", "color",
+     "message color of whitelist buffer name",
+     "", 0, 0, "", "", 0,
+     "", "", "buffers_signal_config", "", "", ""
+ ],
+ "color_whitelist_message_bg" => [
+     "whitelist_message_bg", "color",
+     "message color of whitelist buffer name",
+     "", 0, 0, "", "", 0,
+     "", "", "buffers_signal_config", "", "", ""
+ ],
+ "color_whitelist_private_fg" => [
+     "whitelist_private_fg", "color",
+     "private color of whitelist buffer name",
+     "", 0, 0, "", "", 0,
+     "", "", "buffers_signal_config", "", "", ""
+ ],
+ "color_whitelist_private_bg" => [
+     "whitelist_private_bg", "color",
+     "private color of whitelist buffer name",
+     "", 0, 0, "", "", 0,
+     "", "", "buffers_signal_config", "", "", ""
+ ],
+ "color_whitelist_highlight_fg" => [
+     "whitelist_highlight_fg", "color",
+     "highlight color of whitelist buffer name",
+     "", 0, 0, "", "", 0,
+     "", "", "buffers_signal_config", "", "", ""
+ ],
+ "color_whitelist_highlight_bg" => [
+     "whitelist_highlight_bg", "color",
+     "highlight color of whitelist buffer name",
+     "", 0, 0, "", "", 0,
+     "", "", "buffers_signal_config", "", "", ""
+ ],
+ "color_none_channel_fg" => [
+     "none_channel_fg", "color",
+     "foreground color for none channel buffer (e.g.: core/server/plugin ".
+     "buffer)",
+     "", 0, 0, "default", "default", 0,
+     "", "", "buffers_signal_config", "", "", ""
+ ],
+ "color_none_channel_bg" => [
+     "none_channel_bg", "color",
+     "background color for none channel buffer (e.g.: core/server/plugin ".
+     "buffer)",
+     "", 0, 0, "default", "default", 0,
+     "", "", "buffers_signal_config", "", "", ""
+ ],
+ "queries_default_fg" => [
+     "queries_default_fg", "color",
+     "foreground color for query buffer without message",
+     "", 0, 0, "default", "default", 0,
+     "", "", "buffers_signal_config", "", "", ""
+ ],
+ "queries_default_bg" => [
+     "queries_default_bg", "color",
+     "background color for query buffer without message",
+     "", 0, 0, "default", "default", 0,
+     "", "", "buffers_signal_config", "", "", ""
+ ],
+ "queries_message_fg" => [
+     "queries_message_fg", "color",
+     "foreground color for query buffer with unread message",
+     "", 0, 0, "default", "default", 0,
+     "", "", "buffers_signal_config", "", "", ""
+ ],
+ "queries_message_bg" => [
+     "queries_message_bg", "color",
+     "background color for query buffer with unread message",
+     "", 0, 0, "default", "default", 0,
+     "", "", "buffers_signal_config", "", "", ""
+ ],
+ "queries_highlight_fg" => [
+     "queries_highlight_fg", "color",
+     "foreground color for query buffer with unread highlight",
+     "", 0, 0, "default", "default", 0,
+     "", "", "buffers_signal_config", "", "", ""
+ ],
+ "queries_highlight_bg" => [
+     "queries_highlight_bg", "color",
+     "background color for query buffer with unread highlight",
+     "", 0, 0, "default", "default", 0,
+     "", "", "buffers_signal_config", "", "", ""
+ ],
+ "color_prefix_bufname" => [
+     "prefix_bufname", "color",
+     "color for prefix of buffer name",
+     "", 0, 0, "default", "default", 0,
+     "", "", "buffers_signal_config", "", "", ""
+ ],
+ "color_suffix_bufname" => [
+     "suffix_bufname", "color",
+     "color for suffix of buffer name",
+     "", 0, 0, "default", "default", 0,
+     "", "", "buffers_signal_config", "", "", ""
+ ],
+);
+
+my %default_options_look =
+(
+ "hotlist_counter" => [
+     "hotlist_counter", "boolean",
+     "show number of message for the buffer (this option needs WeeChat >= ".
+     "0.3.5). The relevant option for notification is \"weechat.look.".
+     "buffer_notify_default\"",
+     "", 0, 0, "off", "off", 0,
+     "", "", "buffers_signal_config", "", "", ""
+ ],
+ "show_lag" => [
+     "show_lag", "boolean",
+     "show lag behind server name. This option is using \"irc.color.".
+     "item_lag_finished\", ".
+     "\"irc.network.lag_min_show\" and \"irc.network.lag_refresh_interval\"",
+     "", 0, 0, "off", "off", 0,
+     "", "", "buffers_signal_config", "", "", ""
+ ],
+ "look_whitelist_buffers" => [
+     "whitelist_buffers", "string",
+     "comma separated list of buffers for using a different color scheme ".
+     "(for example: freenode.#weechat,freenode.#weechat-fr)",
+     "", 0, 0, "", "", 0,
+     "", "", "buffers_signal_config_whitelist", "", "", ""
+ ],
+ "hide_merged_buffers" => [
+     "hide_merged_buffers", "integer",
+     "hide merged buffers. The value determines which merged buffers should ".
+     "be hidden, keepserver meaning 'all except server buffers'. Other values ".
+     "correspondent to the buffer type.",
+     "server|channel|private|keepserver|all|none", 0, 0, "none", "none", 0,
+     "", "", "buffers_signal_config", "", "", ""
+ ],
+ "indenting" => [
+     "indenting", "integer", "use indenting for channel and query buffers. ".
+     "This option only takes effect if bar is left/right positioned",
+     "off|on|under_name", 0, 0, "off", "off", 0,
+     "", "", "buffers_signal_config", "", "", ""
+ ],
+ "indenting_number" => [
+     "indenting_number", "boolean",
+     "use indenting for numbers. This option only takes effect if bar is ".
+     "left/right positioned",
+     "", 0, 0, "on", "on", 0,
+     "", "", "buffers_signal_config", "", "", ""
+ ],
+ "short_names" => [
+     "short_names", "boolean",
+     "display short names (remove text before first \".\" in buffer name)",
+     "", 0, 0, "on", "on", 0,
+     "", "", "buffers_signal_config", "", "", ""
+ ],
+ "show_number" => [
+     "show_number", "boolean",
+     "display buffer number in front of buffer name",
+     "", 0, 0, "on", "on", 0,
+     "", "", "buffers_signal_config", "", "", ""
+ ],
+ "show_number_char" => [
+     "number_char", "string",
+     "display a char behind buffer number",
+     "", 0, 0, ".", ".", 0,
+     "", "", "buffers_signal_config", "", "", ""
+ ],
+ "show_prefix_bufname" => [
+     "prefix_bufname", "string",
+     "prefix displayed in front of buffer name",
+     "", 0, 0, "", "", 0,
+     "", "", "buffers_signal_config", "", "", ""
+ ],
+ "show_suffix_bufname" => [
+     "suffix_bufname", "string",
+     "suffix displayed at end of buffer name",
+     "", 0, 0, "", "", 0,
+     "", "", "buffers_signal_config", "", "", ""
+ ],
+ "show_prefix" => [
+     "prefix", "boolean",
+     "displays your prefix for channel in front of buffer name",
+     "", 0, 0, "off", "off", 0,
+     "", "", "buffers_signal_config", "", "", ""
+ ],
+ "show_prefix_empty" => [
+     "prefix_empty", "boolean",
+     "use a placeholder for channels without prefix",
+     "", 0, 0, "on", "on", 0,
+     "", "",  "buffers_signal_config", "", "", ""
+ ],
+ "show_prefix_query" => [
+     "prefix_for_query", "string",
+     "prefix displayed in front of query buffer",
+     "", 0, 0, "", "", 0,
+     "", "", "buffers_signal_config", "", "", ""
+ ],
+ "sort" => [
+     "sort", "integer",
+     "sort buffer-list by \"number\" or \"name\"",
+     "number|name", 0, 0, "number", "number", 0,
+     "", "", "buffers_signal_config", "", "", ""
+ ],
+ "core_to_front" => [
+     "core_to_front", "boolean",
+     "core buffer and buffers with free content will be listed first. ".
+     "Take only effect if buffer sort is by name",
+     "", 0, 0, "off", "off", 0,
+     "", "", "buffers_signal_config", "", "", ""
+ ],
+ "jump_prev_next_visited_buffer" => [
+     "jump_prev_next_visited_buffer", "boolean",
+     "jump to previously or next visited buffer if you click with ".
+     "left/right mouse button on currently visiting buffer",
+     "", 0, 0, "off", "off", 0,
+     "", "", "buffers_signal_config", "", "", ""
+ ],
+ "name_size_max" => [
+     "name_size_max", "integer",
+     "maximum size of buffer name. 0 means no limitation",
+     "", 0, 256, 0, 0, 0,
+     "", "", "buffers_signal_config", "", "", ""
+ ],
+ "name_crop_suffix" => [
+     "name_crop_suffix", "string",
+     "contains an optional char(s) that is appended when buffer name is ".
+     "shortened",
+     "", 0, 0, "+", "+", 0,
+     "", "", "buffers_signal_config", "", "", ""
+ ],
+ "detach" => [
+     "detach", "integer",
+     "detach buffer from buffers list after a specific period of time ".
+     "(in seconds) without action (weechat ≥ 0.3.8 required) (0 means \"off\")",
+     "", 0, 31536000, 0, "number", 0,
+     "", "", "buffers_signal_config", "", "", ""
+ ],
+ "immune_detach_buffers" => [
+     "immune_detach_buffers", "string",
+     "comma separated list of buffers to NOT automatically detach. ".
+     "Allows \"*\" wildcard. Ex: \"BitlBee,freenode.*\"",
+     "", 0, 0, "", "", 0,
+     "", "", "buffers_signal_config_immune_detach_buffers", "", "", ""
+ ],
+ "detach_query" => [
+     "detach_query", "boolean",
+     "query buffer will be detached",
+     "", 0, 0, "off", "off", 0,
+     "", "", "buffers_signal_config", "", "", ""
+ ],
+ "detach_buffer_immediately" => [
+     "detach_buffer_immediately", "string",
+     "comma separated list of buffers to detach immediately. A query and ".
+     "highlight message will attach buffer again. Allows \"*\" wildcard. ".
+     "Ex: \"BitlBee,freenode.*\"",
+     "", 0, 0, "", "", 0,
+     "", "", "buffers_signal_config_detach_buffer_immediately", "", "", ""
+ ],
+ "detach_free_content" => [
+     "detach_free_content", "boolean",
+     "buffers with free content will be detached (Ex: iset, chanmon)",
+     "", 0, 0, "off", "off", 0,
+     "", "", "buffers_signal_config", "", "", ""
+ ],
+ "detach_displayed_buffers" => [
+     "detach_displayed_buffers", "boolean",
+     "buffers displayed in a (split) window will be detached",
+     "", 0, 0, "on", "on", 0,
+     "", "", "buffers_signal_config", "", "", ""
+ ],
+ "detach_display_window_number" => [
+     "detach_display_window_number", "boolean",
+     "window number will be add, behind buffer name (this option takes only ".
+     "effect with \"detach_displayed_buffers\" option)",
+     "", 0, 0, "off", "off", 0,
+     "", "", "buffers_signal_config", "", "", ""
+ ],
+ "mark_inactive" => [
+     "mark_inactive", "boolean",
+     "if option is \"on\", inactive buffers (those you are not in) will have ".
+     "parentheses around them. An inactive buffer will not be detached.",
+     "", 0, 0, "off", "off", 0,
+     "", "", "buffers_signal_config", "", "", ""
+ ],
+ "toggle_bar" => [
+     "toggle_bar", "boolean",
+     "if option is \"on\", buffers bar will hide/show when script is ".
+     "(un)loaded.",
+     "", 0, 0, "on", "on", 0,
+     "", "", "buffers_signal_config", "", "", ""
+ ],
+ "mouse_move_buffer" => [
+     "mouse_move_buffer", "boolean",
+     "if option is \"on\", mouse gestures (drag & drop) can move buffers in list.",
+     "", 0, 0, "on", "on", 0,
+     "", "", "buffers_signal_config", "", "", ""
+ ],
+ "mouse_wheel" => [
+     "mouse_wheel", "boolean",
+     "if option is \"on\", mouse wheel jumps to previous/next buffer in list.",
+     "", 0, 0, "on", "on", 0,
+     "", "", "buffers_signal_config", "", "", ""
+ ],
+);
+    # section "color"
+    my $section_color = weechat::config_new_section(
+        $buffers_config_file,
+        "color", 0, 0, "", "", "", "", "", "", "", "", "", "");
+    if ($section_color eq "")
+    {
+        weechat::config_free($buffers_config_file);
+        return;
+    }
+    foreach my $option (keys %default_options_color)
+    {
+        $options{$option} = weechat::config_new_option(
+            $buffers_config_file,
+            $section_color,
+            $default_options_color{$option}[0],
+            $default_options_color{$option}[1],
+            $default_options_color{$option}[2],
+            $default_options_color{$option}[3],
+            $default_options_color{$option}[4],
+            $default_options_color{$option}[5],
+            $default_options_color{$option}[6],
+            $default_options_color{$option}[7],
+            $default_options_color{$option}[8],
+            $default_options_color{$option}[9],
+            $default_options_color{$option}[10],
+            $default_options_color{$option}[11],
+            $default_options_color{$option}[12],
+            $default_options_color{$option}[13],
+            $default_options_color{$option}[14]);
+    }
+
+    # section "look"
+    my $section_look = weechat::config_new_section(
+        $buffers_config_file,
+        "look", 0, 0, "", "", "", "", "", "", "", "", "", "");
+    if ($section_look eq "")
+    {
+        weechat::config_free($buffers_config_file);
+        return;
+    }
+    foreach my $option (keys %default_options_look)
+    {
+        $options{$option} = weechat::config_new_option(
+            $buffers_config_file,
+            $section_look,
+            $default_options_look{$option}[0],
+            $default_options_look{$option}[1],
+            $default_options_look{$option}[2],
+            $default_options_look{$option}[3],
+            $default_options_look{$option}[4],
+            $default_options_look{$option}[5],
+            $default_options_look{$option}[6],
+            $default_options_look{$option}[7],
+            $default_options_look{$option}[8],
+            $default_options_look{$option}[9],
+            $default_options_look{$option}[10],
+            $default_options_look{$option}[11],
+            $default_options_look{$option}[12],
+            $default_options_look{$option}[13],
+            $default_options_look{$option}[14],
+            $default_options_look{$option}[15]);
+    }
+}
+
+sub build_buffers
+{
+    my $str = "";
+
+    # get bar position (left/right/top/bottom)
+    my $position = "left";
+    my $option_position = weechat::config_get("weechat.bar.buffers.position");
+    if ($option_position ne "")
+    {
+        $position = weechat::config_string($option_position);
+    }
+
+    # read hotlist
+    my %hotlist;
+    my $infolist = weechat::infolist_get("hotlist", "", "");
+    while (weechat::infolist_next($infolist))
+    {
+        $hotlist{weechat::infolist_pointer($infolist, "buffer_pointer")} =
+            weechat::infolist_integer($infolist, "priority");
+        if ( weechat::config_boolean( $options{"hotlist_counter"} ) eq 1 and $weechat_version >= 0x00030500)
+        {
+            $hotlist{weechat::infolist_pointer($infolist, "buffer_pointer")."_count_00"} =
+                weechat::infolist_integer($infolist, "count_00");   # low message
+            $hotlist{weechat::infolist_pointer($infolist, "buffer_pointer")."_count_01"} =
+                weechat::infolist_integer($infolist, "count_01");   # channel message
+            $hotlist{weechat::infolist_pointer($infolist, "buffer_pointer")."_count_02"} =
+                weechat::infolist_integer($infolist, "count_02");   # private message
+            $hotlist{weechat::infolist_pointer($infolist, "buffer_pointer")."_count_03"} =
+                weechat::infolist_integer($infolist, "count_03");   # highlight message
+        }
+    }
+    weechat::infolist_free($infolist);
+
+    # read buffers list
+    @buffers_focus = ();
+    my @buffers;
+    my @current1 = ();
+    my @current2 = ();
+    my $old_number = -1;
+    my $max_number = 0;
+    my $max_number_digits = 0;
+    my $active_seen = 0;
+    $infolist = weechat::infolist_get("buffer", "", "");
+    while (weechat::infolist_next($infolist))
+    {
+        # ignore hidden buffers (WeeChat >= 0.4.4)
+        if ($weechat_version >= 0x00040400)
+        {
+            next if (weechat::infolist_integer($infolist, "hidden"));
+        }
+        my $buffer;
+        my $number = weechat::infolist_integer($infolist, "number");
+        if ($number ne $old_number)
+        {
+            @buffers = (@buffers, @current2, @current1);
+            @current1 = ();
+            @current2 = ();
+            $active_seen = 0;
+        }
+        if ($number > $max_number)
+        {
+            $max_number = $number;
+        }
+        $old_number = $number;
+        my $active = weechat::infolist_integer($infolist, "active");
+        if ($active)
+        {
+            $active_seen = 1;
+        }
+        $buffer->{"pointer"} = weechat::infolist_pointer($infolist, "pointer");
+        $buffer->{"number"} = $number;
+        $buffer->{"active"} = $active;
+        $buffer->{"current_buffer"} = weechat::infolist_integer($infolist, "current_buffer");
+        $buffer->{"num_displayed"} = weechat::infolist_integer($infolist, "num_displayed");
+        $buffer->{"plugin_name"} = weechat::infolist_string($infolist, "plugin_name");
+        $buffer->{"name"} = weechat::infolist_string($infolist, "name");
+        $buffer->{"short_name"} = weechat::infolist_string($infolist, "short_name");
+        $buffer->{"full_name"} = $buffer->{"plugin_name"}.".".$buffer->{"name"};
+        $buffer->{"type"} = weechat::buffer_get_string($buffer->{"pointer"}, "localvar_type");
+        #weechat::print("", $buffer->{"type"});
+
+        # check if buffer is active (or maybe a /part, /kick channel)
+        if ($buffer->{"type"} eq "channel" and weechat::config_boolean( $options{"mark_inactive"} ) eq 1)
+        {
+            my $server = weechat::buffer_get_string($buffer->{"pointer"}, "localvar_server");
+            my $channel = weechat::buffer_get_string($buffer->{"pointer"}, "localvar_channel");
+            my $infolist_channel = weechat::infolist_get("irc_channel", "", $server.",".$channel);
+            if ($infolist_channel)
+            {
+                weechat::infolist_next($infolist_channel);
+                $buffer->{"nicks_count"} = weechat::infolist_integer($infolist_channel, "nicks_count");
+            }else
+            {
+                $buffer->{"nicks_count"} = 0;
+            }
+            weechat::infolist_free($infolist_channel);
+        }
+
+        my $result = check_immune_detached_buffers($buffer->{"name"});          # checking for wildcard 
+
+        next if ( check_detach_buffer_immediately($buffer->{"name"}) eq 1
+                 and $buffer->{"current_buffer"} eq 0
+                 and ( not exists $hotlist{$buffer->{"pointer"}} or $hotlist{$buffer->{"pointer"}} < 2) );          # checking for buffer to immediately detach
+
+        unless ($result)
+        {
+            my $detach_time = weechat::config_integer( $options{"detach"});
+            my $current_time = time();
+            # set timer for buffers with no hotlist action
+            $buffers_timer{$buffer->{"pointer"}} = $current_time
+             if ( not exists $hotlist{$buffer->{"pointer"}}
+             and $buffer->{"type"} eq "channel"
+             and not exists $buffers_timer{$buffer->{"pointer"}}
+             and $detach_time > 0);
+
+            $buffers_timer{$buffer->{"pointer"}} = $current_time
+            if (weechat::config_boolean($options{"detach_query"}) eq 1
+            and not exists $hotlist{$buffer->{"pointer"}}
+            and $buffer->{"type"} eq "private"
+            and not exists $buffers_timer{$buffer->{"pointer"}}
+            and $detach_time > 0);
+
+            $detach_time = 0
+            if (weechat::config_boolean($options{"detach_query"}) eq 0
+            and $buffer->{"type"} eq "private");
+
+            # free content buffer
+            $buffers_timer{$buffer->{"pointer"}} = $current_time
+            if (weechat::config_boolean($options{"detach_free_content"}) eq 1
+            and not exists $hotlist{$buffer->{"pointer"}}
+            and $buffer->{"type"} eq ""
+            and not exists $buffers_timer{$buffer->{"pointer"}}
+            and $detach_time > 0);
+            $detach_time = 0
+            if (weechat::config_boolean($options{"detach_free_content"}) eq 0
+            and $buffer->{"type"} eq "");
+
+            $detach_time = 0 if (weechat::config_boolean($options{"mark_inactive"}) eq 1 and defined $buffer->{"nicks_count"} and $buffer->{"nicks_count"} == 0);
+
+            # check for detach
+            unless ( $buffer->{"current_buffer"} eq 0
+            and not exists $hotlist{$buffer->{"pointer"}}
+#            and $buffer->{"type"} eq "channel"
+            and exists $buffers_timer{$buffer->{"pointer"}}
+            and $detach_time > 0
+            and $weechat_version >= 0x00030800
+            and $current_time - $buffers_timer{$buffer->{"pointer"}} >= $detach_time)
+            {
+                if ($active_seen)
+                {
+                    push(@current2, $buffer);
+                }
+                else
+                {
+                    push(@current1, $buffer);
+                }
+            }
+            elsif ( $buffer->{"current_buffer"} eq 0
+            and not exists $hotlist{$buffer->{"pointer"}}
+#            and $buffer->{"type"} eq "channel"
+            and exists $buffers_timer{$buffer->{"pointer"}}
+            and $detach_time > 0
+            and $weechat_version >= 0x00030800
+            and $current_time - $buffers_timer{$buffer->{"pointer"}} >= $detach_time)
+            {   # check for option detach_displayed_buffers and if buffer is displayed in a split window
+                if ( $buffer->{"num_displayed"} eq 1
+                    and weechat::config_boolean($options{"detach_displayed_buffers"}) eq 0 )
+                {
+                    my $infolist_window = weechat::infolist_get("window", "", "");
+                    while (weechat::infolist_next($infolist_window))
+                    {
+                        my $buffer_ptr = weechat::infolist_pointer($infolist_window, "buffer");
+                        if ($buffer_ptr eq $buffer->{"pointer"})
+                        {
+                            $buffer->{"window"} = weechat::infolist_integer($infolist_window, "number");
+                        }
+                    }
+                    weechat::infolist_free($infolist_window);
+
+                    push(@current2, $buffer);
+                }
+            }
+        }
+        else    # buffer in "immune_detach_buffers"
+        {
+                if ($active_seen)
+                {
+                    push(@current2, $buffer);
+                }
+                else
+                {
+                    push(@current1, $buffer);
+                }
+        }
+    }   # while end
+
+
+    if ($max_number >= 1)
+    {
+        $max_number_digits = length(int($max_number));
+    }
+    @buffers = (@buffers, @current2, @current1);
+    weechat::infolist_free($infolist);
+
+    # sort buffers by number, name or shortname
+    my %sorted_buffers;
+    if (1)
+    {
+        my $number = 0;
+        for my $buffer (@buffers)
+        {
+            my $key;
+            if (weechat::config_integer( $options{"sort"} ) eq 1) # number = 0; name = 1
+            {
+                my $name = weechat::buffer_get_string($buffer->{"pointer"}, "localvar_custom_name");
+                if (not defined $name or $name eq "") {
+                    if (weechat::config_boolean( $options{"short_names"} ) eq 1) {
+                        $name = $buffer->{"short_name"};
+                    } else {
+                        $name = $buffer->{"name"};
+                    }
+                }
+                if (weechat::config_integer($options{"name_size_max"}) >= 1){
+                    $name = encode("UTF-8", substr(decode("UTF-8", $name), 0, weechat::config_integer($options{"name_size_max"})));
+                }
+                if ( weechat::config_boolean($options{"core_to_front"}) eq 1)
+                {
+                    if ( (weechat::buffer_get_string($buffer->{"pointer"}, "localvar_type") ne "channel" ) and ( weechat::buffer_get_string($buffer->{"pointer"}, "localvar_type") ne "private") )
+                    {
+                        my $type = weechat::buffer_get_string($buffer->{"pointer"}, "localvar_type");
+                        if ( $type eq "" and $name ne "weechat")
+                        {
+                            $name = " " . $name
+                        }else
+                        {
+                            $name = "  " . $name;
+                        }
+                    }
+                }
+                $key = sprintf("%s%08d", lc($name), $buffer->{"number"});
+            }
+            else
+            {
+                $key = sprintf("%08d", $number);
+            }
+            $sorted_buffers{$key} = $buffer;
+            $number++;
+        }
+    }
+
+    # build string with buffers
+    $old_number = -1;
+    foreach my $key (sort keys %sorted_buffers)
+    {
+        my $buffer = $sorted_buffers{$key};
+
+        if ( weechat::config_string($options{"hide_merged_buffers"}) eq "server" )
+        {
+            # buffer type "server" or merged with core?
+            if ( ($buffer->{"type"} eq "server" or $buffer->{"plugin_name"} eq "core") && (! $buffer->{"active"}) )
+            {
+                next;
+            }
+        }
+        if ( weechat::config_string($options{"hide_merged_buffers"}) eq "channel" )
+        {
+            # buffer type "channel" or merged with core?
+            if ( ($buffer->{"type"} eq "channel" or $buffer->{"plugin_name"} eq "core") && (! $buffer->{"active"}) )
+            {
+                next;
+            }
+        }
+        if ( weechat::config_string($options{"hide_merged_buffers"}) eq "private" )
+        {
+            # buffer type "private" or merged with core?
+            if ( ($buffer->{"type"} eq "private" or $buffer->{"plugin_name"} eq "core") && (! $buffer->{"active"}) )
+            {
+                next;
+            }
+        }
+        if ( weechat::config_string($options{"hide_merged_buffers"}) eq "keepserver" )
+        {
+            if ( ($buffer->{"type"} ne "server" or $buffer->{"plugin_name"} eq "core") && (! $buffer->{"active"}) )
+            {
+                next;
+            }
+        }
+        if ( weechat::config_string($options{"hide_merged_buffers"}) eq "all" )
+        {
+            if ( ! $buffer->{"active"} )
+            {
+                next;
+            }
+        }
+
+        push(@buffers_focus, $buffer);                                          # buffer > buffers_focus, for mouse support
+        my $color = "";
+        my $bg = "";
+
+        $color = weechat::config_color( $options{"color_default_fg"} );
+        $bg = weechat::config_color( $options{"color_default_bg"} );
+
+        if ( weechat::buffer_get_string($buffer->{"pointer"}, "localvar_type") eq "private" )
+        {
+            if ( (weechat::config_color($options{"queries_default_bg"})) ne "default" || (weechat::config_color($options{"queries_default_fg"})) ne "default" )
+            {
+              $bg = weechat::config_color( $options{"queries_default_bg"} );
+              $color = weechat::config_color( $options{"queries_default_fg"} );
+            }
+        }
+        # check for core and buffer with free content
+        if ( (weechat::buffer_get_string($buffer->{"pointer"}, "localvar_type") ne "channel" ) and ( weechat::buffer_get_string($buffer->{"pointer"}, "localvar_type") ne "private") )
+        {
+            $color = weechat::config_color( $options{"color_none_channel_fg"} );
+            $bg = weechat::config_color( $options{"color_none_channel_bg"} );
+        }
+        # default whitelist buffer?
+        if (grep {$_ eq $buffer->{"name"}} @whitelist_buffers)
+        {
+                $color = weechat::config_color( $options{"color_whitelist_default_fg"} );
+                $bg = weechat::config_color( $options{"color_whitelist_default_bg"} );
+        }
+
+        $color = "default" if ($color eq "");
+
+        # color for channel and query buffer
+        if (exists $hotlist{$buffer->{"pointer"}})
+        {
+        delete $buffers_timer{$buffer->{"pointer"}};
+            # check if buffer is in whitelist buffer
+            if (grep {$_ eq $buffer->{"name"}} @whitelist_buffers)
+            {
+                $bg = weechat::config_color( $options{"color_whitelist_".$hotlist_level{$hotlist{$buffer->{"pointer"}}}."_bg"} );
+                $color = weechat::config_color( $options{"color_whitelist_".$hotlist_level{$hotlist{$buffer->{"pointer"}}}."_fg"} );
+            }
+            elsif ( weechat::buffer_get_string($buffer->{"pointer"}, "localvar_type") eq "private" )
+            {
+                # queries_default_fg/bg and buffers.color.queries_message_fg/bg
+                if ( (weechat::config_color($options{"queries_highlight_fg"})) ne "default" ||
+                      (weechat::config_color($options{"queries_highlight_bg"})) ne "default" ||
+                       (weechat::config_color($options{"queries_message_fg"})) ne "default" ||
+                        (weechat::config_color($options{"queries_message_bg"})) ne "default" )
+                {
+                  if ( ($hotlist{$buffer->{"pointer"}}) == 2 )
+                  {
+                      $bg = weechat::config_color( $options{"queries_message_bg"} );
+                      $color = weechat::config_color( $options{"queries_message_fg"} );
+                  }
+
+                  elsif ( ($hotlist{$buffer->{"pointer"}}) == 3 )
+                  {
+                      $bg = weechat::config_color( $options{"queries_highlight_bg"} );
+                      $color = weechat::config_color( $options{"queries_highlight_fg"} );
+                  }
+                }else
+                {
+                      $bg = weechat::config_color( $options{"color_hotlist_".$hotlist_level{$hotlist{$buffer->{"pointer"}}}."_bg"} );
+                      $color = weechat::config_color( $options{"color_hotlist_".$hotlist_level{$hotlist{$buffer->{"pointer"}}}."_fg"}  );
+                }
+            }else
+            {
+                      $bg = weechat::config_color( $options{"color_hotlist_".$hotlist_level{$hotlist{$buffer->{"pointer"}}}."_bg"} );
+                      $color = weechat::config_color( $options{"color_hotlist_".$hotlist_level{$hotlist{$buffer->{"pointer"}}}."_fg"}  );
+            }
+        }
+
+        if ($buffer->{"current_buffer"})
+        {
+            $color = weechat::config_color( $options{"color_current_fg"} );
+            $bg = weechat::config_color( $options{"color_current_bg"} );
+        }
+        my $color_bg = "";
+        $color_bg = weechat::color(",".$bg) if ($bg ne "");
+
+        # create channel number for output
+        if ( weechat::config_string( $options{"show_prefix_bufname"} ) ne "" )
+        {
+            $str .= $color_bg .
+                    weechat::color( weechat::config_color( $options{"color_prefix_bufname"} ) ).
+                    weechat::config_string( $options{"show_prefix_bufname"} ).
+                    weechat::color("default");
+        }
+
+        if ( weechat::config_boolean( $options{"show_number"} ) eq 1 )   # on
+        {
+            if (( weechat::config_boolean( $options{"indenting_number"} ) eq 1)
+                && (($position eq "left") || ($position eq "right")))
+            {
+                $str .= weechat::color("default").$color_bg
+                    .(" " x ($max_number_digits - length(int($buffer->{"number"}))));
+            }
+            if ($old_number ne $buffer->{"number"})
+            {
+                $str .= weechat::color( weechat::config_color( $options{"color_number"} ) )
+                    .$color_bg
+                    .$buffer->{"number"}
+                    .weechat::color("default")
+                    .$color_bg
+                    .weechat::color( weechat::config_color( $options{"color_number_char"} ) )
+                    .weechat::config_string( $options{"show_number_char"} )
+                    .$color_bg;
+            }
+            else
+            {
+                my $indent = "";
+                $indent = ((" " x length($buffer->{"number"}))." ") if (($position eq "left") || ($position eq "right"));
+                $str .= weechat::color("default")
+                    .$color_bg
+                    .$indent;
+            }
+        }
+
+        if (( weechat::config_integer( $options{"indenting"} ) ne 0 )            # indenting NOT off
+            && (($position eq "left") || ($position eq "right")))
+        {
+            my $type = weechat::buffer_get_string($buffer->{"pointer"}, "localvar_type");
+            if (($type eq "channel") || ($type eq "private"))
+            {
+                if ( weechat::config_integer( $options{"indenting"} ) eq 1 )
+                {
+                    $str .= "  ";
+                }
+                elsif ( (weechat::config_integer($options{"indenting"}) eq 2) and (weechat::config_integer($options{"indenting_number"}) eq 0) )        #under_name
+                {
+                    if ( weechat::config_boolean( $options{"show_number"} ) eq 0 )
+                    {
+                      $str .= "  ";
+                    }else
+                    {
+                      $str .= ( (" " x ( $max_number_digits - length($buffer->{"number"}) ))." " );
+                    }
+                }
+            }
+        }
+
+        $str .= weechat::config_string( $options{"show_prefix_query"}) if (weechat::config_string( $options{"show_prefix_query"} ) ne "" and  $buffer->{"type"} eq "private");
+
+        if (weechat::config_boolean( $options{"show_prefix"} ) eq 1)
+        {
+            my $nickname = weechat::buffer_get_string($buffer->{"pointer"}, "localvar_nick");
+            if ($nickname ne "")
+            {
+                # with version >= 0.3.2, this infolist will return only nick
+                # with older versions, whole nicklist is returned for buffer, and this can be very slow
+                my $infolist_nick = weechat::infolist_get("nicklist", $buffer->{"pointer"}, "nick_".$nickname);
+                if ($infolist_nick ne "")
+                {
+                    while (weechat::infolist_next($infolist_nick))
+                    {
+                        if ((weechat::infolist_string($infolist_nick, "type") eq "nick")
+                            && (weechat::infolist_string($infolist_nick, "name") eq $nickname))
+                        {
+                            my $prefix = weechat::infolist_string($infolist_nick, "prefix");
+                            if (($prefix ne " ") or (weechat::config_boolean( $options{"show_prefix_empty"} ) eq 1))
+                            {
+                                # with version >= 0.3.5, it is now a color name (for older versions: option name with color)
+                                if (int($weechat_version) >= 0x00030500)
+                                {
+                                    $str .= weechat::color(weechat::infolist_string($infolist_nick, "prefix_color"));
+                                }
+                                else
+                                {
+                                    $str .= weechat::color(weechat::config_color(
+                                                               weechat::config_get(
+                                                                   weechat::infolist_string($infolist_nick, "prefix_color"))));
+                                }
+                                $str .= $prefix;
+                            }
+                            last;
+                        }
+                    }
+                    weechat::infolist_free($infolist_nick);
+                }
+            }
+        }
+        if ($buffer->{"type"} eq "channel" and weechat::config_boolean( $options{"mark_inactive"} ) eq 1 and $buffer->{"nicks_count"} == 0)
+        {
+            $str .= "(";
+        }
+
+        $str .= weechat::color($color) . weechat::color(",".$bg);
+
+        my $name = weechat::buffer_get_string($buffer->{"pointer"}, "localvar_custom_name");
+        if (not defined $name or $name eq "")
+        {
+            if (weechat::config_boolean( $options{"short_names"} ) eq 1) {
+                $name = $buffer->{"short_name"};
+            } else {
+                $name = $buffer->{"name"};
+            }
+        }
+
+        if (weechat::config_integer($options{"name_size_max"}) >= 1)                # check max_size of buffer name
+        {
+            $name = decode("UTF-8", $name);
+            $str .= encode("UTF-8", substr($name, 0, weechat::config_integer($options{"name_size_max"})));
+            $str .= weechat::color(weechat::config_color( $options{"color_number_char"})).weechat::config_string($options{"name_crop_suffix"}) if (length($name) > weechat::config_integer($options{"name_size_max"}));
+            $str .= add_inactive_parentless($buffer->{"type"}, $buffer->{"nicks_count"});
+            $str .= add_hotlist_count($buffer->{"pointer"}, %hotlist);
+        }
+        else
+        {
+            $str .= $name;
+            $str .= add_inactive_parentless($buffer->{"type"}, $buffer->{"nicks_count"});
+            $str .= add_hotlist_count($buffer->{"pointer"}, %hotlist);
+        }
+
+        if ( weechat::buffer_get_string($buffer->{"pointer"}, "localvar_type") eq "server" and weechat::config_boolean($options{"show_lag"}) eq 1)
+        {
+            my $color_lag = weechat::config_color(weechat::config_get("irc.color.item_lag_finished"));
+            my $min_lag = weechat::config_integer(weechat::config_get("irc.network.lag_min_show"));
+            my $infolist_server = weechat::infolist_get("irc_server", "", $buffer->{"short_name"});
+            weechat::infolist_next($infolist_server);
+            my $lag = (weechat::infolist_integer($infolist_server, "lag"));
+            weechat::infolist_free($infolist_server);
+            if ( int($lag) > int($min_lag) )
+            {
+                $lag = $lag / 1000;
+                $str .= weechat::color("default") . " (" . weechat::color($color_lag) . $lag . weechat::color("default") . ")";
+            }
+        }
+        if (weechat::config_boolean($options{"detach_displayed_buffers"}) eq 0
+            and weechat::config_boolean($options{"detach_display_window_number"}) eq 1)
+        {
+            if ($buffer->{"window"})
+            {
+                $str .= weechat::color("default") . " (" . weechat::color(weechat::config_color( $options{"color_number"})) . $buffer->{"window"} . weechat::color("default") . ")";
+            }
+        }
+        $str .= weechat::color("default");
+
+        if ( weechat::config_string( $options{"show_suffix_bufname"} ) ne "" )
+        {
+            $str .= weechat::color( weechat::config_color( $options{"color_suffix_bufname"} ) ).
+                    weechat::config_string( $options{"show_suffix_bufname"} ).
+                    weechat::color("default");
+        }
+
+        $str .= "\n";
+        $old_number = $buffer->{"number"};
+    }
+
+    # remove spaces and/or linefeed at the end
+    $str =~ s/\s+$//;
+    chomp($str);
+    return $str;
+}
+
+sub add_inactive_parentless
+{
+my ($buf_type, $buf_nicks_count) = @_;
+my $str = "";
+    if ($buf_type eq "channel" and weechat::config_boolean( $options{"mark_inactive"} ) eq 1 and $buf_nicks_count == 0)
+    {
+        $str .= weechat::color(weechat::config_color( $options{"color_number_char"}));
+        $str .= ")";
+    }
+return $str;
+}
+
+sub add_hotlist_count
+{
+my ($bufpointer, %hotlist) = @_;
+
+return "" if ( weechat::config_boolean( $options{"hotlist_counter"} ) eq 0 or ($weechat_version < 0x00030500));   # off
+my $col_number_char = weechat::color(weechat::config_color( $options{"color_number_char"}) );
+my $str = " ".$col_number_char."(";
+
+# 0 = low level
+if (defined $hotlist{$bufpointer."_count_00"})
+{
+    my $bg = weechat::config_color( $options{"color_hotlist_low_bg"} );
+    my $color = weechat::config_color( $options{"color_hotlist_low_fg"} );
+    $str .= weechat::color($bg).
+            weechat::color($color).
+            $hotlist{$bufpointer."_count_00"} if ($hotlist{$bufpointer."_count_00"} ne "0");
+}
+
+# 1 = message
+if (defined $hotlist{$bufpointer."_count_01"})
+{
+    my $bg = weechat::config_color( $options{"color_hotlist_message_bg"} );
+    my $color = weechat::config_color( $options{"color_hotlist_message_fg"} );
+    if ($str =~ /[0-9]$/)
+    {
+        $str .= ",".
+                weechat::color($bg).
+                weechat::color($color).
+                $hotlist{$bufpointer."_count_01"} if ($hotlist{$bufpointer."_count_01"} ne "0");
+    }else
+    {
+        $str .= weechat::color($bg).
+                weechat::color($color).
+                $hotlist{$bufpointer."_count_01"} if ($hotlist{$bufpointer."_count_01"} ne "0");
+    }
+}
+# 2 = private
+if (defined $hotlist{$bufpointer."_count_02"})
+{
+    my $bg = weechat::config_color( $options{"color_hotlist_private_bg"} );
+    my $color = weechat::config_color( $options{"color_hotlist_private_fg"} );
+    if ($str =~ /[0-9]$/)
+    {
+        $str .= ",".
+                weechat::color($bg).
+                weechat::color($color).
+                $hotlist{$bufpointer."_count_02"} if ($hotlist{$bufpointer."_count_02"} ne "0");
+    }else
+    {
+        $str .= weechat::color($bg).
+                weechat::color($color).
+                $hotlist{$bufpointer."_count_02"} if ($hotlist{$bufpointer."_count_02"} ne "0");
+    }
+}
+# 3 = highlight
+if (defined $hotlist{$bufpointer."_count_03"})
+{
+    my $bg = weechat::config_color( $options{"color_hotlist_highlight_bg"} );
+    my $color = weechat::config_color( $options{"color_hotlist_highlight_fg"} );
+    if ($str =~ /[0-9]$/)
+    {
+        $str .= ",".
+                weechat::color($bg).
+                weechat::color($color).
+                $hotlist{$bufpointer."_count_03"} if ($hotlist{$bufpointer."_count_03"} ne "0");
+    }else
+    {
+        $str .= weechat::color($bg).
+                weechat::color($color).
+                $hotlist{$bufpointer."_count_03"} if ($hotlist{$bufpointer."_count_03"} ne "0");
+    }
+}
+$str .= $col_number_char. ")";
+
+$str = "" if (weechat::string_remove_color($str, "") eq " ()");         # remove color and check for buffer with no messages
+return $str;
+}
+
+sub buffers_signal_buffer
+{
+    my ($data, $signal, $signal_data) = @_;
+
+    # check for buffer_switch and set or remove detach time
+    if ($weechat_version >= 0x00030800)
+    {
+        if ($signal eq "buffer_switch")
+        {
+            my $pointer = weechat::hdata_get_list (weechat::hdata_get("buffer"), "gui_buffer_last_displayed"); # get switched buffer
+            my $current_time = time();
+            if ( weechat::buffer_get_string($pointer, "localvar_type") eq "channel")
+            {
+                $buffers_timer{$pointer} = $current_time;
+            }
+            else
+            {
+                delete $buffers_timer{$pointer};
+            }
+        }
+        if ($signal eq "buffer_opened")
+        {
+            my $current_time = time();
+            $buffers_timer{$signal_data} = $current_time;
+        }
+        if ($signal eq "buffer_closing")
+        {
+            delete $buffers_timer{$signal_data};
+        }
+    }
+    weechat::bar_item_update($SCRIPT_NAME);
+    return weechat::WEECHAT_RC_OK;
+}
+
+sub buffers_signal_hotlist
+{
+    weechat::bar_item_update($SCRIPT_NAME);
+    return weechat::WEECHAT_RC_OK;
+}
+
+
+sub buffers_signal_config_whitelist
+{
+    @whitelist_buffers = ();
+    @whitelist_buffers = split( /,/, weechat::config_string( $options{"look_whitelist_buffers"} ) );
+    weechat::bar_item_update($SCRIPT_NAME);
+    return weechat::WEECHAT_RC_OK;
+}
+
+sub buffers_signal_config_immune_detach_buffers
+{
+    @immune_detach_buffers = ();
+    @immune_detach_buffers = split( /,/, weechat::config_string( $options{"immune_detach_buffers"} ) );
+    weechat::bar_item_update($SCRIPT_NAME);
+    return weechat::WEECHAT_RC_OK;
+}
+
+sub buffers_signal_config_detach_buffer_immediately
+{
+    @detach_buffer_immediately = ();
+    @detach_buffer_immediately = split( /,/, weechat::config_string( $options{"detach_buffer_immediately"} ) );
+    weechat::bar_item_update($SCRIPT_NAME);
+    return weechat::WEECHAT_RC_OK;
+}
+
+sub buffers_signal_config
+{
+    weechat::bar_item_update($SCRIPT_NAME);
+    return weechat::WEECHAT_RC_OK;
+}
+
+# called when mouse click occured in buffers item: this callback returns buffer
+# hash according to line of item where click occured
+sub buffers_focus_buffers
+{
+    my %info = %{$_[1]};
+    my $item_line = int($info{"_bar_item_line"});
+    undef my $hash;
+    if (($info{"_bar_item_name"} eq $SCRIPT_NAME) && ($item_line >= 0) && ($item_line <= $#buffers_focus))
+    {
+        $hash = $buffers_focus[$item_line];
+    }
+    else
+    {
+        $hash = {};
+        my $hash_focus = $buffers_focus[0];
+        foreach my $key (keys %$hash_focus)
+        {
+            $hash->{$key} = "?";
+        }
+    }
+    return $hash;
+}
+
+# called when a mouse action is done on buffers item, to execute action
+# possible actions: jump to a buffer or move buffer in list (drag & drop of buffer)
+sub buffers_hsignal_mouse
+{
+    my ($data, $signal, %hash) = ($_[0], $_[1], %{$_[2]});
+    my $current_buffer = weechat::buffer_get_integer(weechat::current_buffer(), "number"); # get current buffer number
+
+    if ( $hash{"_key"} eq "button1" )
+    {
+        # left mouse button
+        if ($hash{"number"} eq $hash{"number2"})
+        {
+            if ( weechat::config_boolean($options{"jump_prev_next_visited_buffer"}) )
+            {
+                if ( $current_buffer eq $hash{"number"} )
+                {
+                    weechat::command("", "/input jump_previously_visited_buffer");
+                }
+                else
+                {
+                    weechat::command("", "/buffer ".$hash{"full_name"});
+                }
+            }
+            else
+            {
+                weechat::command("", "/buffer ".$hash{"full_name"});
+            }
+        }
+        else
+        {
+            move_buffer(%hash) if (weechat::config_boolean($options{"mouse_move_buffer"}));
+        }
+    }
+    elsif ( ($hash{"_key"} eq "button2") && (weechat::config_boolean($options{"jump_prev_next_visited_buffer"})) )
+    {
+        # right mouse button
+        if ( $current_buffer eq $hash{"number2"} )
+        {
+            weechat::command("", "/input jump_next_visited_buffer");
+        }
+    }
+    elsif ( $hash{"_key"} =~ /wheelup$/ )
+    {
+        # wheel up
+        if (weechat::config_boolean($options{"mouse_wheel"}))
+        {
+            weechat::command("", "/buffer -1");
+        }
+    }
+    elsif ( $hash{"_key"} =~ /wheeldown$/ )
+    {
+        # wheel down
+        if (weechat::config_boolean($options{"mouse_wheel"}))
+        {
+            weechat::command("", "/buffer +1");
+        }
+    }
+    else
+    {
+        my $infolist = weechat::infolist_get("hook", "", "command,menu");
+        my $has_menu_command = weechat::infolist_next($infolist);
+        weechat::infolist_free($infolist);
+
+        if ( $has_menu_command && $hash{"_key"} =~ /button2/ )
+        {
+            if ($hash{"number"} eq $hash{"number2"})
+            {
+                weechat::command($hash{"pointer"}, "/menu buffer1 $hash{short_name} $hash{number}");
+            }
+            else
+            {
+                weechat::command($hash{"pointer"}, "/menu buffer2 $hash{short_name}/$hash{short_name2} $hash{number} $hash{number2}")
+            }
+        }
+        else
+        {
+            move_buffer(%hash) if (weechat::config_boolean($options{"mouse_move_buffer"}));
+        }
+    }
+}
+
+sub move_buffer
+{
+  my %hash = @_;
+  my $number2 = $hash{"number2"};
+  if ($number2 eq "?")
+  {
+      # if number 2 is not known (end of gesture outside buffers list), then set it
+      # according to mouse gesture
+      $number2 = "1";
+      if (($hash{"_key"} =~ /gesture-right/) || ($hash{"_key"} =~ /gesture-down/))
+      {
+          $number2 = "999999";
+          if ($weechat_version >= 0x00030600)
+          {
+              my $hdata_buffer = weechat::hdata_get("buffer");
+              my $last_gui_buffer = weechat::hdata_get_list($hdata_buffer, "last_gui_buffer");
+              if ($last_gui_buffer)
+              {
+                  $number2 = weechat::hdata_integer($hdata_buffer, $last_gui_buffer, "number") + 1;
+              }
+          }
+      }
+  }
+  my $ptrbuf = weechat::current_buffer();
+  weechat::command($hash{"pointer"}, "/buffer move ".$number2);
+}
+
+sub check_immune_detached_buffers
+{
+    my ($buffername) = @_;
+    foreach ( @immune_detach_buffers ){
+        my $immune_buffer = weechat::string_mask_to_regex($_);
+        if ($buffername =~ /^$immune_buffer$/i)
+        {
+            return 1;
+        }
+    }
+    return 0;
+}
+
+sub check_detach_buffer_immediately
+{
+    my ($buffername) = @_;
+    foreach ( @detach_buffer_immediately ){
+        my $detach_buffer = weechat::string_mask_to_regex($_);
+        if ($buffername =~ /^$detach_buffer$/i)
+        {
+            return 1;
+        }
+    }
+    return 0;
+}
+
+sub shutdown_cb
+{
+    weechat::command("", "/bar hide " . $SCRIPT_NAME) if ( weechat::config_boolean($options{"toggle_bar"}) eq 1 );
+    return weechat::WEECHAT_RC_OK
+}
+
+sub check_bar_item
+{
+    my $item = 0;
+    my $infolist = weechat::infolist_get("bar", "", "");
+    while (weechat::infolist_next($infolist))
+    {
+        my $bar_items = weechat::infolist_string($infolist, "items");
+        if (index($bar_items, $SCRIPT_NAME) != -1)
+        {
+            my $name = weechat::infolist_string($infolist, "name");
+            if ($name ne $SCRIPT_NAME)
+            {
+                $item = 1;
+                last;
+            }
+        }
+    }
+    weechat::infolist_free($infolist);
+    return $item;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/weechat/perl/iset.pl	Wed Jan 21 16:45:26 2015 -0800
@@ -0,0 +1,1462 @@
+#
+# Copyright (C) 2008-2014 Sebastien Helleu <flashcode@flashtux.org>
+# Copyright (C) 2010-2014 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:
+#
+# 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 = "3.6";
+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_types = ();
+my @options_values = ();
+my @options_default_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
+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 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]);
+    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);
+        }
+    }
+    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_types = ();
+    @options_values = ();
+    @options_default_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");
+        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 $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}{"type"} = $type;
+                $options_internal{$name}{"value"} = $value;
+                $options_internal{$name}{"default_value"} = $default_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}{"type"} = $type;
+            $options_internal{$name}{"value"} = $value;
+            $options_internal{$name}{"default_value"} = $default_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_types, $options_internal{$name}{"type"});
+        push(@options_values, $options_internal{$name}{"value"});
+        push(@options_default_values, $options_internal{$name}{"default_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_types = ();
+    @options_values = ();
+    @options_default_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");
+        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");
+        if ($search_mode)
+        {
+            if ( grep /\Q$var_value/,lc($value) )
+            {
+                $options_internal{$name}{"type"} = $type;
+                $options_internal{$name}{"value"} = $value;
+                $options_internal{$name}{"default_value"} = $default_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}{"type"} = $type;
+                $options_internal{$name}{"value"} = $value;
+                $options_internal{$name}{"default_value"} = $default_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_types, $options_internal{$name}{"type"});
+        push(@options_values, $options_internal{$name}{"value"});
+        push(@options_default_values, $options_internal{$name}{"default_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 = "";
+            if ($options_is_null[$y])
+            {
+                $color3 = weechat::color(weechat::config_color($options_iset{"color_value_undef"}));
+            }
+            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"}));
+                }
+                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];
+            $value = "(undef)" if ($options_is_null[$y]);
+            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_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
+            my $infolist = weechat::infolist_get("option", "", $option_name);
+            if ($infolist)
+            {
+                weechat::infolist_next($infolist);
+                if (weechat::infolist_fields($infolist))
+                {
+                    $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");
+                    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);
+            }
+        }
+        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;
+            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
+                }
+            }
+            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 = "null";
+            }
+            else
+            {
+                $quote = "\"" if ($options_types[$current_line] eq "string");
+            }
+            my $set_command = "/set";
+            $set_command = "/mute " . $set_command if (weechat::config_boolean($options_iset{"use_mute"}) == 1);
+
+            weechat::buffer_set($iset_buffer, "input", $set_command." ".$options_names[$current_line]." ".$quote.$value.$quote);
+            weechat::command($iset_buffer, "/input move_beginning_of_line");
+            weechat::command($iset_buffer, "/input move_next_word");
+            weechat::command($iset_buffer, "/input move_next_word");
+            weechat::command($iset_buffer, "/input move_next_word") if (weechat::config_boolean($options_iset{"use_mute"}) == 1);
+            weechat::command($iset_buffer, "/input move_next_char");
+            weechat::command($iset_buffer, "/input move_next_char") if ($quote ne "");
+        }
+    }
+    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]});
+
+    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", "f <file> || s <section> || [=][=]<text>",
+                      "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".
+                      "\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 options for file 'weechat'\n".
+                      "    /iset f weechat\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);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/weechat/perl/pushover.pl	Wed Jan 21 16:45:26 2015 -0800
@@ -0,0 +1,302 @@
+#
+# Copyright (C) 2013-2014  stfn <stfnmd@gmail.com>
+# https://github.com/stfnm/weechat-scripts
+#
+# 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/>.
+#
+
+use strict;
+use warnings;
+
+my %SCRIPT = (
+	name => 'pushover',
+	author => 'stfn <stfnmd@gmail.com>',
+	version => '1.2',
+	license => 'GPL3',
+	desc => 'Send push notifications to your mobile devices using Pushover, NMA or Pushbullet',
+	opt => 'plugins.var.perl',
+);
+my %OPTIONS_DEFAULT = (
+	'enabled' => ['on', "Turn script on or off"],
+	'service' => ['pushover', 'Notification service to use. Multiple services may be supplied as comma separated list. (supported services: pushover, nma, pushbullet)'],
+	'token' => ['ajEX9RWhxs6NgeXFJxSK2jmpY54C9S', 'pushover API token/key (You may feel free to use your own token, so you get your own monthly quota of messages without being affected by other users. See also: https://pushover.net/faq#overview-distribution )'],
+	'user' => ['', "pushover user key"],
+	'nma_apikey' => ['', "nma API key"],
+	'pb_apikey' => ['', "Pushbullet API key"],
+	'pb_device_iden' => ['', "Device Iden of pushbullet device"],
+	'sound' => ['', "Sound (empty for default)"],
+	'priority' => ['', "priority (empty for default)"],
+	'show_highlights' => ['on', 'Notify on highlights'],
+	'show_priv_msg' => ['on', 'Notify on private messages'],
+	'redact_priv_msg' => ['off', 'When receiving private message notifications, hide the actual message text'],
+	'only_if_away' => ['off', 'Notify only if away status is active'],
+	'only_if_inactive' => ['off', 'Notify only if buffer is not the active (current) buffer'],
+	'blacklist' => ['', 'Comma separated list of buffers (full name) to blacklist for notifications (wildcard "*" is allowed, name beginning with "!" is excluded)'],
+	'verbose' => ['1', 'Verbosity level (0 = silently ignore any errors, 1 = display brief error, 2 = display full server response)'],
+);
+my %OPTIONS = ();
+my $TIMEOUT = 30 * 1000;
+
+my $DEBUG = 0;
+
+# Register script and initialize config
+weechat::register($SCRIPT{"name"}, $SCRIPT{"author"}, $SCRIPT{"version"}, $SCRIPT{"license"}, $SCRIPT{"desc"}, "", "");
+init_config();
+
+# Setup hooks
+weechat::hook_print("", "notify_message,notify_private,notify_highlight", "", 1, "print_cb", "");
+weechat::hook_command($SCRIPT{"name"}, "send custom push notification",
+	"<text>",
+	"text: notification text to send",
+	"", "pushover_cb", "");
+
+#
+# Handle config stuff
+#
+sub init_config
+{
+	weechat::hook_config("$SCRIPT{'opt'}.$SCRIPT{'name'}.*", "config_cb", "");
+	my $version = weechat::info_get("version_number", "") || 0;
+	foreach my $option (keys %OPTIONS_DEFAULT) {
+		if (!weechat::config_is_set_plugin($option)) {
+			weechat::config_set_plugin($option, $OPTIONS_DEFAULT{$option}[0]);
+			$OPTIONS{$option} = $OPTIONS_DEFAULT{$option}[0];
+		} else {
+			$OPTIONS{$option} = weechat::config_get_plugin($option);
+		}
+		if ($version >= 0x00030500) {
+			weechat::config_set_desc_plugin($option, $OPTIONS_DEFAULT{$option}[1]." (default: \"".$OPTIONS_DEFAULT{$option}[0]."\")");
+		}
+	}
+}
+sub config_cb
+{
+	my ($pointer, $name, $value) = @_;
+	$name = substr($name, length("$SCRIPT{opt}.$SCRIPT{name}."), length($name));
+	$OPTIONS{$name} = $value;
+	return weechat::WEECHAT_RC_OK;
+}
+
+#
+# Case insensitive search for element in comma separated list
+#
+sub grep_list($$)
+{
+	my ($str, $list) = @_;
+	my @array = split(/,/, $list);
+	return grep(/^\Q$str\E$/i, @array) ? 1 : 0;
+}
+
+#
+# URL escape (percent encoding)
+#
+sub url_escape($)
+{
+	my $toencode = $_[0];
+	return undef unless (defined($toencode));
+	utf8::encode($toencode) if (utf8::is_utf8($toencode));
+	$toencode =~ s/([^a-zA-Z0-9_.~-])/uc sprintf("%%%02x",ord($1))/eg;
+	return $toencode;
+}
+
+#
+# Catch printed messages
+#
+sub print_cb
+{
+	my ($data, $buffer, $date, $tags, $displayed, $highlight, $prefix, $message) = @_;
+
+	my $buffer_type = weechat::buffer_get_string($buffer, "localvar_type");
+	my $buffer_full_name = weechat::buffer_get_string($buffer, "full_name");
+	my $away_msg = weechat::buffer_get_string($buffer, "localvar_away");
+	my $away = ($away_msg && length($away_msg) > 0) ? 1 : 0;
+
+	if ($OPTIONS{enabled} ne "on" ||
+	    $displayed == 0 ||
+	    ($OPTIONS{only_if_away} eq "on" && $away == 0) ||
+	    ($OPTIONS{only_if_inactive} eq "on" && $buffer eq weechat::current_buffer()) ||
+	    weechat::buffer_match_list($buffer, $OPTIONS{blacklist})) {
+		return weechat::WEECHAT_RC_OK;
+	}
+
+	my $msg = "[$buffer_full_name] <$prefix> ";
+
+	if ($buffer_type eq "private" && $OPTIONS{redact_priv_msg} eq "on") {
+		$msg .= "...";
+	} else {
+		$msg .= "$message";
+	}
+
+	# Notify!
+	if ($OPTIONS{show_highlights} eq "on" && $highlight == 1) {
+		# Message with highlight
+		notify($msg);
+	} elsif ($OPTIONS{show_priv_msg} eq "on" && $buffer_type eq "private") {
+		# Private message
+		notify($msg);
+	}
+
+	return weechat::WEECHAT_RC_OK;
+}
+
+#
+# /pushover
+#
+sub pushover_cb
+{
+	my ($data, $buffer, $args) = @_;
+
+	if (length($args) > 0) {
+		notify($args);
+	}
+
+	return weechat::WEECHAT_RC_OK;
+}
+
+#
+# Catch API responses
+#
+sub url_cb
+{
+	my ($data, $command, $return_code, $out, $err) = @_;
+	my $msg = "[$SCRIPT{name}] Error: ";
+
+	# Check verbosity level
+	if ($OPTIONS{verbose} == 0) {
+		return weechat::WEECHAT_RC_OK; # Don't display anything
+	} elsif ($OPTIONS{verbose} == 1) {
+		$msg .= "API call failed. (Most likely the service is having trouble.)";
+
+	} elsif ($OPTIONS{verbose} == 2) {
+		$msg .= "@_";
+	}
+
+	# Check server response and display error message if NOT successful
+	if ($command =~ /pushover/ && $return_code == 0 && !($out =~ /\"status\":1/)) {
+		weechat::print("", $msg);
+	} elsif ($command =~ /notifymyandroid/ && $return_code == 0 && !($out =~ /success code=\"200\"/)) {
+		weechat::print("", $msg);
+	} elsif ($command =~ /pushbullet/ && $return_code == 0 && !($out =~ /\"iden\"/)) {
+		weechat::print("", $msg);
+	}
+
+	return weechat::WEECHAT_RC_OK;
+}
+
+#
+# Notify wrapper (decides which service to use)
+#
+sub notify($)
+{
+	my $message = $_[0];
+
+	# Notify services
+	if (grep_list("pushover", $OPTIONS{service})) {
+		notify_pushover($OPTIONS{token}, $OPTIONS{user}, $message, "weechat", $OPTIONS{priority}, $OPTIONS{sound});
+	}
+	if (grep_list("nma", $OPTIONS{service})) {
+		notify_nma($OPTIONS{nma_apikey}, "weechat", "$SCRIPT{name}.pl", $message, $OPTIONS{priority});
+	}
+	if (grep_list("pushbullet", $OPTIONS{service})) {
+		notify_pushbullet($OPTIONS{pb_apikey}, $OPTIONS{pb_device_iden}, "weechat", $message);
+	}
+}
+
+#
+# https://pushover.net/api
+#
+sub notify_pushover($$$$$$)
+{
+	my ($token, $user, $message, $title, $priority, $sound) = @_;
+
+	# Required API arguments
+	my @post = (
+		"token=" . url_escape($token),
+		"user=" . url_escape($user),
+		"message=" . url_escape($message),
+	);
+
+	# Optional API arguments
+	push(@post, "title=" . url_escape($title)) if ($title && length($title) > 0);
+	push(@post, "priority=" . url_escape($priority)) if ($priority && length($priority) > 0);
+	push(@post, "sound=" . url_escape($sound)) if ($sound && length($sound) > 0);
+
+	# Send HTTP POST
+	my $hash = { "post"  => 1, "postfields" => join(";", @post) };
+	if ($DEBUG) {
+		weechat::print("", "[$SCRIPT{name}] Debug: msg -> `$message' HTTP POST -> @post");
+	} else {
+		weechat::hook_process_hashtable("url:https://api.pushover.net/1/messages.json", $hash, $TIMEOUT, "url_cb", "");
+	}
+
+	return weechat::WEECHAT_RC_OK;
+}
+
+#
+# https://www.notifymyandroid.com/api.jsp
+#
+sub notify_nma($$$$$)
+{
+	my ($apikey, $application, $event, $description, $priority) = @_;
+
+	# Required API arguments
+	my @post = (
+		"apikey=" . url_escape($apikey),
+		"application=" . url_escape($application),
+		"event=" . url_escape($event),
+		"description=" . url_escape($description),
+	);
+
+	# Optional API arguments
+	push(@post, "priority=" . url_escape($priority)) if ($priority && length($priority) > 0);
+
+	# Send HTTP POST
+	my $hash = { "post"  => 1, "postfields" => join("&", @post) };
+	if ($DEBUG) {
+		weechat::print("", "[$SCRIPT{name}] Debug: msg -> `$description' HTTP POST -> @post");
+	} else {
+		weechat::hook_process_hashtable("url:https://www.notifymyandroid.com/publicapi/notify", $hash, $TIMEOUT, "url_cb", "");
+	}
+
+	return weechat::WEECHAT_RC_OK;
+}
+
+#
+# https://docs.pushbullet.com/v2/pushes/
+#
+sub notify_pushbullet($$$$)
+{
+	my ($apikey, $device_iden, $title, $body) = @_;
+
+	# Required API arguments
+	my $apiurl = "https://$apikey\@api.pushbullet.com/v2/pushes";
+	my @post = (
+		"type=note",
+	);
+
+	# Optional API arguments
+	push(@post, "device_iden=" . url_escape($device_iden)) if ($device_iden && length($device_iden) > 0);
+	push(@post, "title=" . url_escape($title)) if ($title && length($title) > 0);
+	push(@post, "body=" . url_escape($body)) if ($body && length($body) > 0);
+
+	# Send HTTP POST
+	my $hash = { "post"  => 1, "postfields" => join("&", @post) };
+	if ($DEBUG) {
+		weechat::print("", "$apiurl [$SCRIPT{name}] Debug: msg -> `$body' HTTP POST -> @post");
+	} else {
+		weechat::hook_process_hashtable("url:$apiurl", $hash, $TIMEOUT, "url_cb", "");
+	}
+
+	return weechat::WEECHAT_RC_OK;
+}
--- a/weechat/plugins.conf	Wed Jan 21 16:37:49 2015 -0800
+++ b/weechat/plugins.conf	Wed Jan 21 16:45:26 2015 -0800
@@ -1,13 +1,56 @@
 #
-# plugins.conf -- weechat v0.4.2
+# plugins.conf -- weechat v1.1
 #
 
 [var]
 fifo.fifo = "on"
+guile.check_license = "off"
 lua.check_license = "off"
 perl.check_license = "off"
+perl.pushover.blacklist = ""
+perl.pushover.enabled = "on"
+perl.pushover.nma_apikey = ""
+perl.pushover.only_if_away = "off"
+perl.pushover.only_if_inactive = "off"
+perl.pushover.pb_apikey = ""
+perl.pushover.pb_device_iden = ""
+perl.pushover.priority = ""
+perl.pushover.redact_priv_msg = "off"
+perl.pushover.service = "pushover"
+perl.pushover.show_highlights = "on"
+perl.pushover.show_priv_msg = "on"
+perl.pushover.sound = ""
+perl.pushover.token = "${sec.data.pushover.token}"
+perl.pushover.user = "${sec.data.pushover.user}"
+perl.pushover.verbose = "1"
 python.check_license = "off"
+python.urlbar.ignore = "grep"
+python.urlbar.remember_amount = "25"
+python.urlbar.show_buffername = "on"
+python.urlbar.show_index = "on"
+python.urlbar.show_nick = "on"
+python.urlbar.show_timestamp = "on"
+python.urlbar.time_format = "%H:%M"
+python.urlbar.use_popup = "on"
+python.urlbar.visible_amount = "5"
+python.urlbar.visible_seconds = "5"
 ruby.check_license = "off"
 tcl.check_license = "off"
 
 [desc]
+perl.pushover.blacklist = "Comma separated list of buffers (full name) to blacklist for notifications (wildcard "*" is allowed, name beginning with "!" is excluded) (default: "")"
+perl.pushover.enabled = "Turn script on or off (default: "on")"
+perl.pushover.nma_apikey = "nma API key (default: "")"
+perl.pushover.only_if_away = "Notify only if away status is active (default: "off")"
+perl.pushover.only_if_inactive = "Notify only if buffer is not the active (current) buffer (default: "off")"
+perl.pushover.pb_apikey = "Pushbullet API key (default: "")"
+perl.pushover.pb_device_iden = "Device Iden of pushbullet device (default: "")"
+perl.pushover.priority = "priority (empty for default) (default: "")"
+perl.pushover.redact_priv_msg = "When receiving private message notifications, hide the actual message text (default: "off")"
+perl.pushover.service = "Notification service to use. Multiple services may be supplied as comma separated list. (supported services: pushover, nma, pushbullet) (default: "pushover")"
+perl.pushover.show_highlights = "Notify on highlights (default: "on")"
+perl.pushover.show_priv_msg = "Notify on private messages (default: "on")"
+perl.pushover.sound = "Sound (empty for default) (default: "")"
+perl.pushover.token = "pushover API token/key (You may feel free to use your own token, so you get your own monthly quota of messages without being affected by other users. See also: https://pushover.net/faq#overview-distribution ) (default: "ajEX9RWhxs6NgeXFJxSK2jmpY54C9S")"
+perl.pushover.user = "pushover user key (default: "")"
+perl.pushover.verbose = "Verbosity level (0 = silently ignore any errors, 1 = display brief error, 2 = display full server response) (default: "1")"
--- a/weechat/sec.conf	Wed Jan 21 16:37:49 2015 -0800
+++ b/weechat/sec.conf	Wed Jan 21 16:45:26 2015 -0800
@@ -1,5 +1,5 @@
 #
-# sec.conf -- weechat v0.4.2
+# sec.conf -- weechat v1.1
 #
 
 [crypt]
@@ -10,8 +10,10 @@
 
 [data]
 __passphrase__ = on
-oftc = "F99FF5351476A94DDE4015A9FAA058015F14477E62D8543F61E5DE1121950682375A6287C8F16EA898E4789204F41E1BAFEE122F1E9501BDA9"
-quakenet = "EC953760A3DB704380615B2F9E7A52BD249D2EE4D7637DFFF22F1C3BE36B43B7F1572523F6BB78D9BB8498F93A7C7124068811"
-freenode = "64B810C5336E5B9A243A7F36D71E189CE32BDE149E663DA98DCFCC16E18EB23D9741B1DDA054189CC474664158409E1C8267B34DD8A7B7"
-nick = "BECC087485681F91441BF725DBDDCC5EC3127B39197AFFC4C8692FF94F2B7C2CA213C84832FD67F4156AD027827F08152084"
-sorcery = "880997891EB0DF236D784D159229EEE3B61F68F9855A6925601397E16D2B04650BBDA27FE58D5E2A139CEC5EED42D3A98137C1B02B3BB3"
+oftc = "ED9A6D65C0467287C4498BAF4BA8AC9931C199224C371608D2043AD630317E84478D26D4C738252063A98AAEB95B6E19153443BBE5051F6551"
+quakenet = "1010AF3948F072A1A62A5F351B8A06DDC5D15A3CDFF7FB0AB1A71FA34E6D6D2AC8E7C8B5B1D686BDB46C79D30044B7C05A41A6"
+freenode = "1C64A293E23579ECCA2E77A0B330E986BFCE08B88C8B194234B21B8AE7A0845BD324E658E6D7E1C3060291392CD3A7776B1A5F45153E0C"
+pushover.token = "6B96130AE17EF7028B301646C9F32E40B573C0779BA6E2EA48B7C8102D1E8C7AAA314ECC858121FD372708D5E4E645534D837C7EA0B7AF83FA503F42E2FC16BE76741CEDA0569E"
+pushover.user = "A867698EF226C4602FFD86CC4A982DFBD4BB77CD2B5EFE92F7AAF63A56BF7FE0AC62297C3E2833AE078CF44827BD346A790B5B540CC81FD49D02F43DA5D74EABEF79AB2FCF90F1"
+nick = "3E14B50A576C411D115F011CDC784AEBE9D36B3F412614FC71E5EC4FFCE4132C517B19025F76BF4DE43CFA3BA74038DDCB9A"
+sorcery = "5D6220417C744F0992EEF5629CF744400C4F5092EE3CDC0C84B2DB9B1E6992C8B8E9168B676B9B679C9E05F8B360FF56CA13AFB86B61EC"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/weechat/trigger.conf	Wed Jan 21 16:45:26 2015 -0800
@@ -0,0 +1,47 @@
+#
+# trigger.conf -- weechat v1.1
+#
+
+[look]
+enabled = on
+monitor_strip_colors = off
+
+[color]
+flag_command = lightgreen
+flag_conditions = yellow
+flag_regex = lightcyan
+flag_return_code = lightmagenta
+regex = white
+replace = cyan
+trigger = green
+trigger_disabled = red
+
+[trigger]
+beep.enabled = on
+beep.hook = "print"
+beep.arguments = ""
+beep.conditions = "${tg_displayed} && (${tg_highlight} || ${tg_msg_pv})"
+beep.regex = ""
+beep.command = "/print -beep"
+beep.return_code = "ok"
+cmd_pass.enabled = on
+cmd_pass.hook = "modifier"
+cmd_pass.arguments = "5000|input_text_display;5000|history_add;5000|irc_command_auth"
+cmd_pass.conditions = ""
+cmd_pass.regex = "==^((/(msg|quote) +nickserv +(id|identify|register|ghost +[^ ]+|release +[^ ]+|regain +[^ ]+) +)|/oper +[^ ]+ +|/quote +pass +|/set +[^ ]*password[^ ]* +|/secure +(passphrase|decrypt|set +[^ ]+) +)(.*)==${re:1}${hide:*,${re:+}}"
+cmd_pass.command = ""
+cmd_pass.return_code = ""
+msg_auth.enabled = on
+msg_auth.hook = "modifier"
+msg_auth.arguments = "5000|irc_message_auth"
+msg_auth.conditions = ""
+msg_auth.regex = "==^(.*(id|identify|register|ghost +[^ ]+|release +[^ ]+) +)(.*)==${re:1}${hide:*,${re:+}}"
+msg_auth.command = ""
+msg_auth.return_code = ""
+server_pass.enabled = on
+server_pass.hook = "modifier"
+server_pass.arguments = "5000|input_text_display;5000|history_add"
+server_pass.conditions = ""
+server_pass.regex = "==^(/(server|connect) .*-(sasl_)?password=)([^ ]+)(.*)==${re:1}${hide:*,${re:4}}${re:5}"
+server_pass.command = ""
+server_pass.return_code = "(null)"
--- a/weechat/weechat.conf	Wed Jan 21 16:37:49 2015 -0800
+++ b/weechat/weechat.conf	Wed Jan 21 16:45:26 2015 -0800
@@ -202,6 +202,20 @@
 save_config_on_unload = on
 
 [bar]
+buffers.color_bg = default
+buffers.color_delim = default
+buffers.color_fg = default
+buffers.conditions = ""
+buffers.filling_left_right = vertical
+buffers.filling_top_bottom = columns_vertical
+buffers.hidden = on
+buffers.items = "buffers"
+buffers.position = top
+buffers.priority = 0
+buffers.separator = on
+buffers.size = 0
+buffers.size_max = 0
+buffers.type = root
 input.color_bg = default
 input.color_delim = cyan
 input.color_fg = default
@@ -216,6 +230,20 @@
 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
@@ -530,11 +558,17 @@
 @chat:q = "hsignal:chat_quote_prefix_message;/cursor stop"
 
 [key_mouse]
+@bar(buffers):ctrl-wheeldown = "hsignal:buffers_mouse"
+@bar(buffers):ctrl-wheelup = "hsignal:buffers_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"
@@ -544,6 +578,8 @@
 @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(buffers):button1* = "hsignal:buffers_mouse"
+@item(buffers):button2* = "hsignal:buffers_mouse"
 @bar:wheeldown = "/bar scroll ${_bar_name} ${_window_number} +20%"
 @bar:wheelup = "/bar scroll ${_bar_name} ${_window_number} -20%"
 @chat:button1 = "/window ${_window_number}"