1e885626f656

Merge.
[view raw] [browse files]
author Steve Losh <steve@stevelosh.com>
date Wed, 19 Feb 2014 15:49:21 -0500
parents 5de0fef33bc7 (current diff) 292a50987061 (diff)
children d6b09d11fdb8
branches/tags (none)
files fish/functions/weechat.fish

Changes

--- a/.hgignore	Wed Feb 19 15:40:37 2014 -0500
+++ b/.hgignore	Wed Feb 19 15:49:21 2014 -0500
@@ -12,6 +12,7 @@
 
 vim/tmp
 vim/bundle/gundo
+vim/bundle/nand2tetris-hdl
 
 mutt/temp
 mutt/cache
@@ -30,5 +31,6 @@
 bin/http_load
 fish/fish_read_history
 fish/completions
+fish/generated_completions/
 weechat/python/autoload/local.py
 weechat/script/plugins.xml.gz
--- a/.hgsub	Wed Feb 19 15:40:37 2014 -0500
+++ b/.hgsub	Wed Feb 19 15:49:21 2014 -0500
@@ -2,7 +2,6 @@
 mercurial/histedit               = [hg]https://bitbucket.org/durin42/histedit
 mercurial/templates              = [hg]https://bitbucket.org/sjl/mercurial-cli-templates
 vim/bundle/AnsiEsc.vim           = [git]git://github.com/sjl/AnsiEsc.vim.git
-vim/bundle/YouCompleteMe         = [git]git://github.com/Valloric/YouCompleteMe.git
 vim/bundle/abolish               = [git]git://github.com/tpope/vim-abolish.git
 vim/bundle/ack                   = [git]git://github.com/mileszs/ack.vim.git
 vim/bundle/argumentative         = [git]git://github.com/PeterRincker/vim-argumentative.git
@@ -18,6 +17,7 @@
 vim/bundle/gundo                 = [hg]https://bitbucket.org/sjl/gundo.vim/
 vim/bundle/html5                 = [git]git://github.com/othree/html5.vim.git
 vim/bundle/indent-object         = [git]git://github.com/michaeljsmith/vim-indent-object.git
+vim/bundle/jack                  = [git]git://github.com/zirrostig/vim-jack-syntax.git
 vim/bundle/javascript            = [git]git://github.com/pangloss/vim-javascript.git
 vim/bundle/linediff              = [git]git://github.com/AndrewRadev/linediff.vim.git
 vim/bundle/markdown              = [git]git://github.com/tpope/vim-markdown.git
@@ -42,3 +42,4 @@
 vim/bundle/tslime                = [git]git://github.com/sjl/tslime.vim.git
 vim/bundle/vitality              = [hg]https://bitbucket.org/sjl/vitality.vim
 vim/bundle/yankring              = [git]git://github.com/vim-scripts/YankRing.vim.git
+vim/bundle/you-complete-me       = [git]git://github.com/Valloric/YouCompleteMe.git
--- a/.hgsubstate	Wed Feb 19 15:40:37 2014 -0500
+++ b/.hgsubstate	Wed Feb 19 15:49:21 2014 -0500
@@ -1,8 +1,7 @@
-661dbd42f386611a1c03f3eaf82927d3f1b874d8 mercurial/hg-prompt
+1cb3af183d2f692622f84da88d5ca18bd4f91b1f mercurial/hg-prompt
 b0da16490f168f68072973b45dbc27a74fb7b529 mercurial/histedit
 4d95cb18a3b420154ef978c53de1d2e692f8343d mercurial/templates
 64981213be2efd939e6e6e109e2b32c24e95fd95 vim/bundle/AnsiEsc.vim
-18be5c254a48590b81dfc492ed15f36f11be8cd9 vim/bundle/YouCompleteMe
 d64ce06650cf9b098b5a01c0db53864965d9310b vim/bundle/abolish
 f183a345a0c10caed7684d07dabae33e007c7590 vim/bundle/ack
 6c4663589e73e21e77a9ea8403dcf2bf6cf9c11c vim/bundle/argumentative
@@ -12,12 +11,13 @@
 dc349bb7d30f713d770fc1fa0fe209e6aab82dc8 vim/bundle/commentary
 c1646e3c28d75bcc834af4836f4c6e12296ba891 vim/bundle/ctrlp
 ffbd5eb50c9daf67657b87fd767d1801ac9a15a7 vim/bundle/dispatch
-544769274a3e6cf8f0ff452d7e9c8feb224b268e vim/bundle/fireplace
+3a843cb1b183bd853b843fbaef89af27b726ac25 vim/bundle/fireplace
 34e2d2538a634a0a820a56994333ffa1fec1bc58 vim/bundle/fugitive
 6e9f52a160e3d15060848a8f453bd1b5bfa70db2 vim/bundle/gnupg
 eb9fc8676b8959c3c2c95bf6b6e8f0f44317c5c0 vim/bundle/gundo
 34b407d2344a3c2a94b56e9d443e18e01e8544d9 vim/bundle/html5
 78fffa609b3e6b84ef01ee4c9aba6d7435d7b18e vim/bundle/indent-object
+d1f19733ff5594cf5d6fb498fc599f02326860a6 vim/bundle/jack
 395f8901b34cc871c9576886938a6efda0eb7268 vim/bundle/javascript
 78646801aac4d3d85e7c4e9570deccfce81a50e7 vim/bundle/linediff
 dcdab0cd55da5e0b8655c000d99d96624cd6404c vim/bundle/markdown
@@ -39,6 +39,7 @@
 26fbdd7d1f1aa5600d2ebf39bbdd292c38aac16e vim/bundle/strftimedammit
 1a73f607f8f5477d6942df2eb6e7245c4864f4d3 vim/bundle/surround
 14cb306414dda411b1809a088e18eb2796030095 vim/bundle/syntastic
-2dee007ddae8156735cbae7f0cd4e0a24ba7287b vim/bundle/tslime
+ae0c83fe45bcc34becc0e7f79ccc6d458a4274cf vim/bundle/tslime
 84365f56fc87c11f1f04eed487d256cf8b128f7c vim/bundle/vitality
 a884f3a161fa3cd8c996eb53a3d1c68631f60c21 vim/bundle/yankring
+18be5c254a48590b81dfc492ed15f36f11be8cd9 vim/bundle/you-complete-me
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/bencode	Wed Feb 19 15:49:21 2014 -0500
@@ -0,0 +1,145 @@
+#!/usr/bin/env python
+# The contents of this file are subject to the BitTorrent Open Source License
+# Version 1.1 (the License).  You may not copy or use this file, in either
+# source code or executable form, except in compliance with the License.  You
+# may obtain a copy of the License at http://www.bittorrent.com/license/.
+#
+# Software distributed under the License is distributed on an AS IS basis,
+# WITHOUT WARRANTY OF ANY KIND, either express or implied.  See the License
+# for the specific language governing rights and limitations under the
+# License.
+
+# Written by Petru Paler
+
+class BTFailure(Exception):
+    pass
+
+
+def decode_int(x, f):
+    f += 1
+    newf = x.index('e', f)
+    n = int(x[f:newf])
+    if x[f] == '-':
+        if x[f + 1] == '0':
+            raise ValueError
+    elif x[f] == '0' and newf != f+1:
+        raise ValueError
+    return (n, newf+1)
+
+def decode_string(x, f):
+    colon = x.index(':', f)
+    n = int(x[f:colon])
+    if x[f] == '0' and colon != f+1:
+        raise ValueError
+    colon += 1
+    return (x[colon:colon+n], colon+n)
+
+def decode_list(x, f):
+    r, f = [], f+1
+    while x[f] != 'e':
+        v, f = decode_func[x[f]](x, f)
+        r.append(v)
+    return (r, f + 1)
+
+def decode_dict(x, f):
+    r, f = {}, f+1
+    while x[f] != 'e':
+        k, f = decode_string(x, f)
+        r[k], f = decode_func[x[f]](x, f)
+    return (r, f + 1)
+
+decode_func = {}
+decode_func['l'] = decode_list
+decode_func['d'] = decode_dict
+decode_func['i'] = decode_int
+decode_func['0'] = decode_string
+decode_func['1'] = decode_string
+decode_func['2'] = decode_string
+decode_func['3'] = decode_string
+decode_func['4'] = decode_string
+decode_func['5'] = decode_string
+decode_func['6'] = decode_string
+decode_func['7'] = decode_string
+decode_func['8'] = decode_string
+decode_func['9'] = decode_string
+
+def bdecode(x):
+    try:
+        r, l = decode_func[x[0]](x, 0)
+    except (IndexError, KeyError, ValueError):
+        raise BTFailure("not a valid bencoded string")
+    if l != len(x):
+        raise BTFailure("invalid bencoded value (data after valid prefix)")
+    return r
+
+from types import StringType, IntType, LongType, DictType, ListType, TupleType
+
+
+class Bencached(object):
+
+    __slots__ = ['bencoded']
+
+    def __init__(self, s):
+        self.bencoded = s
+
+def encode_bencached(x,r):
+    r.append(x.bencoded)
+
+def encode_int(x, r):
+    r.extend(('i', str(x), 'e'))
+
+def encode_bool(x, r):
+    if x:
+        encode_int(1, r)
+    else:
+        encode_int(0, r)
+        
+def encode_string(x, r):
+    r.extend((str(len(x)), ':', x))
+
+def encode_list(x, r):
+    r.append('l')
+    for i in x:
+        encode_func[type(i)](i, r)
+    r.append('e')
+
+def encode_dict(x,r):
+    r.append('d')
+    ilist = x.items()
+    ilist.sort()
+    for k, v in ilist:
+        r.extend((str(len(k)), ':', k))
+        encode_func[type(v)](v, r)
+    r.append('e')
+
+encode_func = {}
+encode_func[Bencached] = encode_bencached
+encode_func[IntType] = encode_int
+encode_func[LongType] = encode_int
+encode_func[StringType] = encode_string
+encode_func[ListType] = encode_list
+encode_func[TupleType] = encode_list
+encode_func[DictType] = encode_dict
+
+try:
+    from types import BooleanType
+    encode_func[BooleanType] = encode_bool
+except ImportError:
+    pass
+
+def bencode(x):
+    r = []
+    encode_func[type(x)](x, r)
+    return ''.join(r)
+
+if __name__ == '__main__':
+    import sys, pprint
+
+    line = sys.stdin.readline()
+    while line:
+        try:
+            pprint.pprint(bdecode(line.strip()))
+        except:
+            sys.stdout.write(line)
+        sys.stdout.flush()
+        line = sys.stdin.readline()
--- a/bin/bootstrap.sh	Wed Feb 19 15:40:37 2014 -0500
+++ b/bin/bootstrap.sh	Wed Feb 19 15:49:21 2014 -0500
@@ -15,6 +15,7 @@
 mkdir -p ~/lib/virtualenvs
 mkdir -p ~/bin
 mkdir -p ~/src
+mkdir -p ~/Library/KeyBindings
 
 ensure_link "lib/dotfiles/hgrc" ".hgrc"
 
@@ -25,6 +26,7 @@
 
 test -d ~/lib/dotfiles || hg clone http://bitbucket.org/sjl/dotfiles ~/lib/dotfiles
 
+ensure_link "lib/dotfiles/DefaultKeyBinding.dict" "Library/KeyBindings/DefaultKeyBinding.dict"
 ensure_link "lib/dotfiles/slate"               ".slate"
 ensure_link "lib/dotfiles/tmux/tmux.conf"      ".tmux.conf"
 ensure_link "lib/dotfiles/vim"                 ".vim"
--- a/bin/vim	Wed Feb 19 15:40:37 2014 -0500
+++ b/bin/vim	Wed Feb 19 15:49:21 2014 -0500
@@ -1,3 +1,3 @@
 #!/usr/bin/env bash
 
-PATH=~/.vim/bullshit:$PATH exec $VIM_BINARY "$@"
+PYTHONPATH="" PATH=~/.vim/bullshit:$PATH exec $VIM_BINARY "$@"
--- a/fish/config.fish	Wed Feb 19 15:40:37 2014 -0500
+++ b/fish/config.fish	Wed Feb 19 15:49:21 2014 -0500
@@ -37,6 +37,7 @@
 # names have underscores so they look pretty.
 function jesus_fucking_christ_bind_the_fucking_keys_fish
     bind \cn accept-autosuggestion
+    bind \cw backward-kill-word
 end
 function fish_user_keybindings
     jesus_fucking_christ_bind_the_fucking_keys_fish
@@ -48,6 +49,8 @@
 # }}}
 # Environment variables {{{
 
+set -g -x NIX_LINK "$HOME/.nix-profile"
+
 function prepend_to_path -d "Prepend the given dir to PATH if it exists and is not already in it"
     if test -d $argv[1]
         if not contains $argv[1] $PATH
@@ -62,7 +65,7 @@
 prepend_to_path "/bin"
 prepend_to_path "/usr/bin"
 prepend_to_path "/usr/local/bin"
-prepend_to_path "/usr/local/share/python"
+# prepend_to_path "/usr/local/share/python"
 prepend_to_path "/usr/local/sbin"
 prepend_to_path "/usr/local/share/npm/bin"
 prepend_to_path "$HOME/bin"
@@ -74,6 +77,7 @@
 prepend_to_path "/usr/local/Cellar/ruby/1.9.3-p194/bin"
 prepend_to_path "/Applications/Postgres.app/Contents/MacOS/bin"
 prepend_to_path "$HOME/.rbenv/shims"
+prepend_to_path "$NIX_LINK/bin"
 
 set BROWSER open
 
@@ -95,6 +99,21 @@
 
 set -g -x GPG_TTY (tty)
 
+function headed_java -d "Put Java into headed mode"
+    echo "Changing _JAVA_OPTIONS"
+    echo "from: $_JAVA_OPTIONS"
+    set -g -e _JAVA_OPTIONS
+    echo "  to: $_JAVA_OPTIONS"
+end
+function headless_java -d "Put Java into headless mode"
+    echo "Changing _JAVA_OPTIONS"
+    echo "from: $_JAVA_OPTIONS"
+    set -g -x _JAVA_OPTIONS "-Djava.awt.headless=true"
+    echo "  to: $_JAVA_OPTIONS"
+end
+
+
+
 # }}}
 # Python variables {{{
 
--- a/fish/functions/weechat.fish	Wed Feb 19 15:40:37 2014 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,3 +0,0 @@
-function weechat
-    weechat-curses $argv
-end
--- a/inputrc	Wed Feb 19 15:40:37 2014 -0500
+++ b/inputrc	Wed Feb 19 15:49:21 2014 -0500
@@ -0,0 +1,1 @@
+"\C-w": backward-kill-word
--- a/keyremap4macbook/private.xml	Wed Feb 19 15:40:37 2014 -0500
+++ b/keyremap4macbook/private.xml	Wed Feb 19 15:49:21 2014 -0500
@@ -1122,8 +1122,7 @@
 
             <identifier>f_zero.enable</identifier>
 
-            <autogen>__HoldingKeyToKey__ KeyCode::F, ModifierFlag::NONE, KeyCode::F, KeyCode::VK_NONE, KeyCode::VK_MODIFIER_EXTRA2</autogen>
-            <!-- <autogen>__KeyOverlaidModifier__ KeyCode::F, ModifierFlag::NONE, KeyCode::VK_MODIFIER_EXTRA2, KeyCode::F</autogen> -->
+            <autogen>__HoldingKeyToKey__ KeyCode::F, KeyCode::F, KeyCode::VK_NONE, KeyCode::VK_MODIFIER_EXTRA2</autogen>
             <autogen>__KeyToKey__ KeyCode::H, ModifierFlag::EXTRA2, KeyCode::CURSOR_LEFT</autogen>
             <autogen>__KeyToKey__ KeyCode::J, ModifierFlag::EXTRA2, KeyCode::CURSOR_DOWN</autogen>
             <autogen>__KeyToKey__ KeyCode::K, ModifierFlag::EXTRA2, KeyCode::CURSOR_UP</autogen>
--- a/vim/vimrc	Wed Feb 19 15:40:37 2014 -0500
+++ b/vim/vimrc	Wed Feb 19 15:49:21 2014 -0500
@@ -653,6 +653,14 @@
 " }}}
 " Filetype-specific ------------------------------------------------------- {{{
 
+" Assembly {{{
+
+augroup ft_asm
+    au!
+    au FileType asm setlocal noexpandtab shiftwidth=8 tabstop=8 softtabstop=8
+augroup END
+
+" }}}
 " C {{{
 
 augroup ft_c
@@ -755,9 +763,50 @@
 " }}}
 " Common Lisp {{{
 
+function! SendToTmuxStripped(text)
+    call SendToTmux(substitute(a:text, '\v\n*$', '', ''))
+endfunction
+function! SetLispWords()
+    if exists("g:did_set_lisp_words")
+        return
+    endif
+
+    let g:did_set_lisp_words = 1
+
+    set lispwords+=switch
+    set lispwords+=cswitch
+    set lispwords+=eswitch
+endfunction
+
 augroup ft_commonlisp
     au!
 
+    au BufNewFile,BufRead *.asd setfiletype lisp
+
+    au FileType lisp call SetLispWords()
+
+    " Set up some basic tslime mappings until I shave the fuckin
+    " Fireplace/Common Lisp yak.
+    "
+    " key  desc                   mnemonic
+    " \t - connect tslime         [t]slime
+    " \f - send current form      [f]orm
+    " \e - send top-level form    [e]val
+    " \r - send entire file       [r]eload file
+    " \c - send ctrl-l            [c]lear
+
+    " Send the current form to the REPL
+    au FileType lisp nnoremap <buffer> <silent> <localleader>f :let lisp_tslime_view = winsaveview()<cr>vab"ry:call SendToTmuxStripped(@r)<cr>:call winrestview(lisp_tslime_view)<cr>
+
+    " Send the current top-level form to the REPL
+    au FileType lisp nnoremap <buffer> <silent> <localleader>e :let lisp_tslime_view = winsaveview()<cr>:silent! normal! l<cr>:call PareditFindDefunBck()<cr>vab"ry:call SendToTmuxStripped(@r)<cr>:call winrestview(lisp_tslime_view)<cr>
+
+    " Send the entire buffer to the REPL
+    au FileType lisp nnoremap <buffer> <silent> <localleader>r :let lisp_tslime_view = winsaveview()<cr>ggVG"ry:call SendToTmuxStripped(@r)<cr>:call winrestview(lisp_tslime_view)<cr>
+
+    " Clear the REPL
+    au FileType lisp nnoremap <buffer> <silent> <localleader>c :call SendToTmuxRaw("")<cr>
+
     au FileType lisp RainbowParenthesesActivate
     au syntax lisp RainbowParenthesesLoadRound
     au syntax lisp RainbowParenthesesLoadSquare
@@ -1015,6 +1064,15 @@
 augroup END
 
 " }}}
+" Nand2Tetris HDL {{{
+
+augroup ft_n2thdl
+    au!
+
+    au BufNewFile,BufRead *.hdl set filetype=n2thdl
+augroup END
+
+" }}}
 " Nginx {{{
 
 augroup ft_nginx
@@ -1535,9 +1593,9 @@
 " tslime {{{
 
 let g:tslime_ensure_trailing_newlines = 1
-let g:tslime_normal_mapping = '<localleader>t'
+let g:tslime_normal_mapping = '<localleader>T'
 let g:tslime_visual_mapping = '<localleader>t'
-let g:tslime_vars_mapping = '<localleader>T'
+let g:tslime_vars_mapping = '<localleader>t'
 
 " }}}
 " YankRing {{{
--- a/weechat/alias.conf	Wed Feb 19 15:40:37 2014 -0500
+++ b/weechat/alias.conf	Wed Feb 19 15:49:21 2014 -0500
@@ -1,5 +1,5 @@
 #
-# alias.conf -- weechat v0.4.1
+# alias.conf -- weechat v0.4.2
 #
 
 [cmd]
--- a/weechat/aspell.conf	Wed Feb 19 15:40:37 2014 -0500
+++ b/weechat/aspell.conf	Wed Feb 19 15:49:21 2014 -0500
@@ -1,9 +1,10 @@
 #
-# aspell.conf -- weechat v0.4.1
+# aspell.conf -- weechat v0.4.2
 #
 
-[look]
-color = red
+[color]
+misspelled = lightred
+suggestions = default
 
 [check]
 commands = "ame,amsg,away,command,cycle,kick,kickban,me,msg,notice,part,query,quit,topic"
--- a/weechat/buffers.conf	Wed Feb 19 15:40:37 2014 -0500
+++ b/weechat/buffers.conf	Wed Feb 19 15:49:21 2014 -0500
@@ -1,5 +1,5 @@
 #
-# buffers.conf -- weechat v0.4.1
+# buffers.conf -- weechat v0.4.2
 #
 
 [color]
@@ -19,7 +19,16 @@
 none_channel_fg = 240
 number = green
 number_char = green
-whitelist_default = default
+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
@@ -30,13 +39,32 @@
 whitelist_private_fg = default
 
 [look]
-hide_merged_buffers = on
+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
+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 = ""
+toogle_bar = on
 whitelist_buffers = ""
--- a/weechat/charset.conf	Wed Feb 19 15:40:37 2014 -0500
+++ b/weechat/charset.conf	Wed Feb 19 15:49:21 2014 -0500
@@ -1,5 +1,5 @@
 #
-# charset.conf -- weechat v0.4.1
+# charset.conf -- weechat v0.4.2
 #
 
 [default]
--- a/weechat/logger.conf	Wed Feb 19 15:40:37 2014 -0500
+++ b/weechat/logger.conf	Wed Feb 19 15:49:21 2014 -0500
@@ -1,5 +1,5 @@
 #
-# logger.conf -- weechat v0.4.1
+# logger.conf -- weechat v0.4.2
 #
 
 [look]
--- a/weechat/perl/autoload/buffers.pl	Wed Feb 19 15:40:37 2014 -0500
+++ b/weechat/perl/autoload/buffers.pl	Wed Feb 19 15:49:21 2014 -0500
@@ -1,5 +1,6 @@
 #
-# Copyright (c) 2008-2011 by Sébastien Helleu <flashcode@flashtux.org>
+# 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
@@ -12,72 +13,124 @@
 # 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/>.
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
 #
-
 #
 # Display sidebar with list of buffers.
 #
 # History:
 #
-# 2012-01-04, Sébastien Helleu <flashcode@flashtux.org>:
-#     2.7: fix regex lookup in whitelist buffers list
-# 2011-12-04, Nils G <weechatter@arcor.de>:
-#     2.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 G <weechatter@arcor.de>:
-#     2.5: add new options "show_number_char" and "color_number_char",
-#          add help-description for options
-# 2011-08-24, Sébastien Helleu <flashcode@flashtux.org>:
+# 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 G <weechatter@arcor.de>:
+# 2011-06-06, nils_2 <weechatter@arcor.de>:
 #     v2.3: added: missed option "color_whitelist_default"
-# 2011-03-23, Sébastien Helleu <flashcode@flashtux.org>:
+# 2011-03-23, Sebastien Helleu <flashcode@flashtux.org>:
 #     v2.2: fix color of nick prefix with WeeChat >= 0.3.5
-# 2011-02-13, Nils G <weechatter@arcor.de>:
+# 2011-02-13, nils_2 <weechatter@arcor.de>:
 #     v2.1: add options "color_whitelist_*"
-# 2010-10-05, Sébastien Helleu <flashcode@flashtux.org>:
+# 2010-10-05, Sebastien Helleu <flashcode@flashtux.org>:
 #     v2.0: add options "sort" and "show_number"
-# 2010-04-12, Sébastien Helleu <flashcode@flashtux.org>:
+# 2010-04-12, Sebastien Helleu <flashcode@flashtux.org>:
 #     v1.9: replace call to log() by length() to align buffer numbers
-# 2010-04-02, Sébastien Helleu <flashcode@flashtux.org>:
+# 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, Sébastien Helleu <flashcode@flashtux.org>:
+# 2010-02-12, Sebastien Helleu <flashcode@flashtux.org>:
 #     v1.5: add optional nick prefix for buffers like IRC channels
-# 2009-09-30, Sébastien Helleu <flashcode@flashtux.org>:
+# 2009-09-30, Sebastien Helleu <flashcode@flashtux.org>:
 #     v1.4: remove spaces for indenting when bar position is top/bottom
-# 2009-06-14, Sébastien Helleu <flashcode@flashtux.org>:
+# 2009-06-14, Sebastien Helleu <flashcode@flashtux.org>:
 #     v1.3: add option "hide_merged_buffers"
-# 2009-06-14, Sébastien Helleu <flashcode@flashtux.org>:
+# 2009-06-14, Sebastien Helleu <flashcode@flashtux.org>:
 #     v1.2: improve display with merged buffers
-# 2009-05-02, Sébastien Helleu <flashcode@flashtux.org>:
+# 2009-05-02, Sebastien Helleu <flashcode@flashtux.org>:
 #     v1.1: sync with last API changes
-# 2009-02-21, Sébastien Helleu <flashcode@flashtux.org>:
+# 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, Sébastien Helleu <flashcode@flashtux.org>:
+# 2009-02-17, Sebastien Helleu <flashcode@flashtux.org>:
 #     v0.9: fix bug with indenting of private buffers
-# 2009-01-04, Sébastien Helleu <flashcode@flashtux.org>:
+# 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, Sébastien Helleu <flashcode@flashtux.org>:
+# 2008-10-01, Sebastien Helleu <flashcode@flashtux.org>:
 #     v0.6: add default color for buffers, and color for current active buffer
-# 2008-09-18, Sébastien Helleu <flashcode@flashtux.org>:
+# 2008-09-18, Sebastien Helleu <flashcode@flashtux.org>:
 #     v0.5: fix color for "low" level entry in hotlist
-# 2008-09-18, Sébastien Helleu <flashcode@flashtux.org>:
+# 2008-09-18, Sebastien Helleu <flashcode@flashtux.org>:
 #     v0.4: rename option "show_category" to "short_names",
 #           remove option "color_slash"
-# 2008-09-15, Sébastien Helleu <flashcode@flashtux.org>:
+# 2008-09-15, Sebastien Helleu <flashcode@flashtux.org>:
 #     v0.3: fix bug with priority in hotlist (var not defined)
-# 2008-09-02, Sébastien Helleu <flashcode@flashtux.org>:
+# 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, Sébastien Helleu <flashcode@flashtux.org>:
+# 2008-03-15, Sebastien Helleu <flashcode@flashtux.org>:
 #     v0.1: script creation
 #
 # Help about settings:
@@ -86,44 +139,240 @@
 #   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 $version = "2.7";
+my $SCRIPT_NAME = "buffers";
+my $SCRIPT_VERSION = "4.5";
 
 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");
+my %mouse_keys          = ("\@item(buffers):button1*"    => "hsignal:buffers_mouse",     # catch all left mouse button gestures
+                           "\@item(buffers):button2*"     => "hsignal:buffers_mouse");    # catch all right mouse button gestures
 my %options;
-my %hotlist_level = (0 => "low", 1 => "message", 2 => "private", 3 => "highlight");
-my @whitelist_buffers = "";
-my @buffers_focus = ();
+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("buffers", "Sébastien Helleu <flashcode\@flashtux.org>", $version,
-                  "GPL3", "Sidebar with list of buffers", "", "");
+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("buffers", "build_buffers", "");
-weechat::bar_new("buffers", "0", "0", "root", "", "left", "horizontal",
+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",
-                 "buffers");
-weechat::hook_signal("buffer_*", "buffers_signal_buffer", "");
-weechat::hook_signal("hotlist_*", "buffers_signal_hotlist", "");
-weechat::bar_item_update("buffers");
+                 $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("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("buffers", "buffers_focus_buffers", "");
+    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", "");
+    $Hooks{timer_detach} = weechat::hook_timer( weechat::config_integer( $options{"detach"}) * 1000, 60, 0, "buffers_signal_hotlist", "") if ( weechat::config_integer( $options{"detach"}) > 0 );
+}
+
+    weechat::hook_config("buffers.look.show_lag", "hook_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", "") if ( weechat::config_boolean($options{"show_lag"}) );
+
+# -------------------------------- [ 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 .= $_ .",";
+        }
+        chop $buffers_list;                                                               # remove last ","
+    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 "");
@@ -135,13 +384,83 @@
 sub buffers_config_reload_cb
 {
     my ($data,$config_file) = ($_[0], $_[1]);
-    return weechat::config_read($config_file)
+    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 servername. 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 differnt 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 channel number in front of buffername", "", 0, 0, "on", "on", 0, "", "", "buffers_signal_config", "", "", ""],
+ "show_number_char" => ["number_char", "string", "display a char behind channel number", "", 0, 0, ".", ".", 0, "", "", "buffers_signal_config", "", "", ""],
+ "show_prefix_bufname" => ["prefix_bufname", "string", "prefix displayed in front of buffername", "", 0, 0, "", "", 0, "", "", "buffers_signal_config", "", "", ""],
+ "show_suffix_bufname" => ["suffix_bufname", "string", "suffix displayed at end of buffername", "", 0, 0, "", "", 0, "", "", "buffers_signal_config", "", "", ""],
+ "show_prefix" => ["prefix", "boolean", "displays your prefix for channel in front of buffername", "", 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 channel 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 detatch. Allows \"*\" wildcard. Ex: \"BitlBee,freenode.*\"", "", 0, 0, "", "", 0, "", "", "buffers_signal_config_immune_detach_buffers", "", "", ""],
+ "detach_query" => ["detach_query", "boolean", "query buffer will be detachted", "", 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 parentesis around them. An inactive buffer will not be detached.", "", 0, 0, "off", "off", 0, "", "", "buffers_signal_config", "", "", ""],
+ "toggle_bar" => ["toogle_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", "", "", ""],
+);
     # section "color"
     my $section_color = weechat::config_new_section($buffers_config_file,"color", 0, 0, "", "", "", "", "", "", "", "", "", "");
     if ($section_color eq "")
@@ -149,106 +468,15 @@
         weechat::config_free($buffers_config_file);
         return;
     }
-    $options{"color_current_fg"} = weechat::config_new_option(
-        $buffers_config_file, $section_color,
-        "current_fg", "color", "foreground color for current buffer", "", 0, 0,
-        "lightcyan", "lightcyan", 0, "", "", "buffers_signal_config", "", "", "");
-    $options{"color_current_bg"} = weechat::config_new_option(
-        $buffers_config_file, $section_color,
-        "current_bg", "color", "background color for current buffer", "", 0, 0,
-        "red", "red", 0, "", "", "buffers_signal_config", "", "", "");
-    $options{"color_default_fg"} = weechat::config_new_option(
-        $buffers_config_file, $section_color,
-        "default_fg", "color", "default foreground color for buffer name", "", 0, 0,
-        "default", "default", 0, "", "", "buffers_signal_config", "", "", "");
-    $options{"color_default_bg"} = weechat::config_new_option(
-        $buffers_config_file, $section_color,
-        "default_bg", "color", "default background color for buffer name", "", 0, 0,
-        "default", "default", 0, "", "", "buffers_signal_config", "", "", "");
-    $options{"color_hotlist_highlight_fg"} = weechat::config_new_option(
-        $buffers_config_file, $section_color,
-        "hotlist_highlight_fg", "color", "change foreground color of buffer name if a highlight messaged received", "", 0, 0,
-        "magenta", "magenta", 0, "", "", "buffers_signal_config", "", "", "");
-    $options{"color_hotlist_highlight_bg"} = weechat::config_new_option(
-        $buffers_config_file, $section_color,
-        "hotlist_highlight_bg", "color", "change background color of buffer name if a highlight messaged received", "", 0, 0,
-        "default", "default", 0, "", "", "buffers_signal_config", "", "", "");
-    $options{"color_hotlist_low_fg"} = weechat::config_new_option(
-        $buffers_config_file, $section_color,
-        "hotlist_low_fg", "color", "change foreground color of buffer name if a low message received", "", 0, 0,
-        "white", "white", 0, "", "", "buffers_signal_config", "", "", "");
-    $options{"color_hotlist_low_bg"} = weechat::config_new_option(
-        $buffers_config_file, $section_color,
-        "hotlist_low_bg", "color", "change background color of buffer name if a low message received", "", 0, 0,
-        "default", "default", 0, "", "", "buffers_signal_config", "", "", "");
-    $options{"color_hotlist_message_fg"} = weechat::config_new_option(
-        $buffers_config_file, $section_color,
-        "hotlist_message_fg", "color", "change foreground color of buffer name if a normal message received", "", 0, 0,
-        "yellow", "yellow", 0, "", "", "buffers_signal_config", "", "", "");
-    $options{"color_hotlist_message_bg"} = weechat::config_new_option(
-        $buffers_config_file, $section_color,
-        "hotlist_message_bg", "color", "change background color of buffer name if a normal message received", "", 0, 0,
-        "default", "default", 0, "", "", "buffers_signal_config", "", "", "");
-    $options{"color_hotlist_private_fg"} = weechat::config_new_option(
-        $buffers_config_file, $section_color,
-        "hotlist_private_fg", "color", "change foreground color of buffer name if a private message received", "", 0, 0,
-        "lightgreen", "lightgreen", 0, "", "", "buffers_signal_config", "", "", "");
-    $options{"color_hotlist_private_bg"} = weechat::config_new_option(
-        $buffers_config_file, $section_color,
-        "hotlist_private_bg", "color", "change background color of buffer name if a private message received", "", 0, 0,
-        "default", "default", 0, "", "", "buffers_signal_config", "", "", "");
-    $options{"color_number"} = weechat::config_new_option(
-        $buffers_config_file, $section_color,
-        "number", "color", "color for buffer number", "", 0, 0,
-        "lightgreen", "lightgreen", 0, "", "", "buffers_signal_config", "", "", "");
-    $options{"color_number_char"} = weechat::config_new_option(
-        $buffers_config_file, $section_color,
-        "number_char", "color", "color for buffer number char", "", 0, 0,
-        "lightgreen", "lightgreen", 0, "", "", "buffers_signal_config", "", "", "");
-    $options{"color_whitelist_default"} = weechat::config_new_option(
-        $buffers_config_file, $section_color,
-        "whitelist_default", "color", "default color for whitelist buffer name", "", 0, 0,
-        "", "", 0, "", "", "buffers_signal_config", "", "", "");
-    $options{"color_whitelist_low_fg"} = weechat::config_new_option(
-        $buffers_config_file, $section_color,
-        "whitelist_low_fg", "color", "low color of whitelist buffer name", "", 0, 0,
-        "", "", 0, "", "", "buffers_signal_config", "", "", "");
-    $options{"color_whitelist_low_bg"} = weechat::config_new_option(
-        $buffers_config_file, $section_color,
-        "whitelist_low_bg", "color", "low color of whitelist buffer name", "", 0, 0,
-        "", "", 0, "", "", "buffers_signal_config", "", "", "");
-    $options{"color_whitelist_message_fg"} = weechat::config_new_option(
-        $buffers_config_file, $section_color,
-        "whitelist_message_fg", "color", "message color of whitelist buffer name", "", 0, 0,
-        "", "", 0, "", "", "buffers_signal_config", "", "", "");
-    $options{"color_whitelist_message_bg"} = weechat::config_new_option(
-        $buffers_config_file, $section_color,
-        "whitelist_message_bg", "color", "message color of whitelist buffer name", "", 0, 0,
-        "", "", 0, "", "", "buffers_signal_config", "", "", "");
-    $options{"color_whitelist_private_fg"} = weechat::config_new_option(
-        $buffers_config_file, $section_color,
-        "whitelist_private_fg", "color", "private color of whitelist buffer name", "", 0, 0,
-        "", "", 0, "", "", "buffers_signal_config", "", "", "");
-    $options{"color_whitelist_private_bg"} = weechat::config_new_option(
-        $buffers_config_file, $section_color,
-        "whitelist_private_bg", "color", "private color of whitelist buffer name", "", 0, 0,
-        "", "", 0, "", "", "buffers_signal_config", "", "", "");
-    $options{"color_whitelist_highlight_fg"} = weechat::config_new_option(
-        $buffers_config_file, $section_color,
-        "whitelist_highlight_fg", "color", "highlight color of whitelist buffer name", "", 0, 0,
-        "", "", 0, "", "", "buffers_signal_config", "", "", "");
-    $options{"color_whitelist_highlight_bg"} = weechat::config_new_option(
-        $buffers_config_file, $section_color,
-        "whitelist_highlight_bg", "color", "highlight color of whitelist buffer name", "", 0, 0,
-        "", "", 0, "", "", "buffers_signal_config", "", "", "");
-    $options{"color_none_channel_fg"} = weechat::config_new_option(
-        $buffers_config_file, $section_color,
-        "none_channel_fg", "color", "foreground color for none channel buffer (e.g.: core/server/plugin buffer)", "", 0, 0,
-        "default", "default", 0, "", "", "buffers_signal_config", "", "", "");
-    $options{"color_none_channel_bg"} = weechat::config_new_option(
-        $buffers_config_file, $section_color,
-        "none_channel_bg", "color", "background color for none channel buffer (e.g.: core/server/plugin buffer)", "", 0, 0,
-        "default", "default", 0, "", "", "buffers_signal_config", "", "", "");
+    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, "", "", "", "", "", "", "", "", "", "");
@@ -257,45 +485,16 @@
         weechat::config_free($buffers_config_file);
         return;
     }
-    $options{"color_whitelist_buffers"} = weechat::config_new_option(
-        $buffers_config_file, $section_look,
-        "whitelist_buffers", "string", "comma separated list of buffers for using a differnt color scheme (for example: freenode.#weechat,freenode.#weechat-fr)", "", 0, 0,"", "", 0, "", "", "buffers_signal_config_whitelist", "", "", "");
-    $options{"hide_merged_buffers"} = weechat::config_new_option(
-        $buffers_config_file, $section_look,
-        "hide_merged_buffers", "boolean", "hide merged buffers", "", 0, 0,
-        "off", "off", 0, "", "", "buffers_signal_config", "", "", "");
-    $options{"indenting"} = weechat::config_new_option(
-        $buffers_config_file, $section_look,
-        "indenting", "integer", "use indenting for some buffers like IRC channels", "off|on|under_name", 0, 0,
-        "off", "off", 0, "", "", "buffers_signal_config", "", "", "");
-    $options{"indenting_number"} = weechat::config_new_option(
-        $buffers_config_file, $section_look,
-        "indenting_number", "boolean", "use indenting for numbers", "", 0, 0,
-        "on", "on", 0, "", "", "buffers_signal_config", "", "", "");
-    $options{"short_names"} = weechat::config_new_option(
-        $buffers_config_file, $section_look,
-        "short_names", "boolean", "display short names (remove text before first \".\" in buffer name)", "", 0, 0,
-        "on", "on", 0, "", "", "buffers_signal_config", "", "", "");
-    $options{"show_number"} = weechat::config_new_option(
-        $buffers_config_file, $section_look,
-        "show_number", "boolean", "display channel number in front of buffername", "", 0, 0,
-        "on", "on", 0, "", "", "buffers_signal_config", "", "", "");
-    $options{"show_number_char"} = weechat::config_new_option(
-        $buffers_config_file, $section_look,
-        "number_char", "string", "display a char after channel number", "", 0, 0,
-        ".", ".", 0, "", "", "buffers_signal_config", "", "", "");
-    $options{"show_prefix"} = weechat::config_new_option(
-        $buffers_config_file, $section_look,
-        "prefix", "boolean", "show your prefix for channel", "", 0, 0,
-        "off", "off", 0, "", "", "buffers_signal_config", "", "", "");
-    $options{"show_prefix_empty"} = weechat::config_new_option(
-        $buffers_config_file, $section_look,
-        "prefix_empty", "boolean", "use a placeholder for channels without prefix", "", 0, 0,
-        "on", "on", 0, "", "", "buffers_signal_config", "", "", "");
-    $options{"sort"} = weechat::config_new_option(
-        $buffers_config_file, $section_look,
-        "sort", "integer", "sort buffer-list by \"number\" or \"name\"", "number|name", 0, 0,
-        "number", "number", 0, "", "", "buffers_signal_config", "", "", "");
+    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
@@ -317,6 +516,17 @@
     {
         $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);
 
@@ -355,19 +565,130 @@
         $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"};
-        if ($active_seen)
+        $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)
         {
-            push(@current2, $buffer);
+            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);
         }
-        else
+
+        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)
         {
-            push(@current1, $buffer);
+            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));
@@ -383,10 +704,27 @@
         for my $buffer (@buffers)
         {
             my $key;
-            if (weechat::config_integer( $options{"sort"} ) eq 1) # number = 0, name = 1
+            if (weechat::config_integer( $options{"sort"} ) eq 1) # number = 0; name = 1
             {
                 my $name = $buffer->{"name"};
                 $name = $buffer->{"short_name"} if (weechat::config_boolean( $options{"short_names"} ) eq 1);
+                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
@@ -403,18 +741,62 @@
     foreach my $key (sort keys %sorted_buffers)
     {
         my $buffer = $sorted_buffers{$key};
-        if ( (weechat::config_boolean( $options{"hide_merged_buffers"} ) eq 1) && (! $buffer->{"active"}) )
+
+        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" )
         {
-            next;
+            # 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);
+        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"} );
-        # check for none channel and private buffer
+
+        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"} );
@@ -423,22 +805,50 @@
         # default whitelist buffer?
         if (grep {$_ eq $buffer->{"name"}} @whitelist_buffers)
         {
-            $color = weechat::config_color( $options{"color_whitelist_default"} );
+                $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"}  );
+                $color = weechat::config_color( $options{"color_whitelist_".$hotlist_level{$hotlist{$buffer->{"pointer"}}}."_fg"} );
             }
-            else
+            elsif ( weechat::buffer_get_string($buffer->{"pointer"}, "localvar_type") eq "private" )
             {
-                $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"}  );
+                # 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"}  );
             }
         }
 
@@ -449,7 +859,17 @@
         }
         my $color_bg = "";
         $color_bg = weechat::color(",".$bg) if ($bg ne "");
-        if ( weechat::config_boolean( $options{"show_number"} ) eq 1)
+
+        # 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")))
@@ -477,6 +897,7 @@
                     .$indent;
             }
         }
+
         if (( weechat::config_integer( $options{"indenting"} ) ne 0 )            # indenting NOT off
             && (($position eq "left") || ($position eq "right")))
         {
@@ -487,12 +908,21 @@
                 {
                     $str .= "  ";
                 }
-                elsif ( (weechat::config_integer($options{"indenting"}) eq 2) and (weechat::config_integer($options{"indenting_number"}) eq 0) )
+                elsif ( (weechat::config_integer($options{"indenting"}) eq 2) and (weechat::config_integer($options{"indenting_number"}) eq 0) )        #under_name
                 {
-                    $str .= ( (" " x ( $max_number_digits - length($buffer->{"number"}) ))." " );
+                    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");
@@ -503,8 +933,6 @@
                 my $infolist_nick = weechat::infolist_get("nicklist", $buffer->{"pointer"}, "nick_".$nickname);
                 if ($infolist_nick ne "")
                 {
-                    my $version = weechat::info_get("version_number", "");
-                    $version = 0 if ($version eq "");
                     while (weechat::infolist_next($infolist_nick))
                     {
                         if ((weechat::infolist_string($infolist_nick, "type") eq "nick")
@@ -514,7 +942,7 @@
                             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($version) >= 0x00030500)
+                                if (int($weechat_version) >= 0x00030500)
                                 {
                                     $str .= weechat::color(weechat::infolist_string($infolist_nick, "prefix_color"));
                                 }
@@ -533,56 +961,255 @@
                 }
             }
         }
+        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);
+
         if (weechat::config_boolean( $options{"short_names"} ) eq 1)
         {
-            $str .= $buffer->{"short_name"};
+            if (weechat::config_integer($options{"name_size_max"}) >= 1)                # check max_size of buffer name
+            {
+                $str .= encode("UTF-8", substr(decode("UTF-8", $buffer->{"short_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($buffer->{"short_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 .= $buffer->{"short_name"};
+                $str .= add_inactive_parentless($buffer->{"type"},$buffer->{"nicks_count"});
+                $str .= add_hotlist_count($buffer->{"pointer"},%hotlist);
+            }
         }
         else
         {
-            $str .= $buffer->{"name"};
+            if (weechat::config_integer($options{"name_size_max"}) >= 1)                # check max_size of buffer name
+            {
+                $str .= encode("UTF-8", substr(decode("UTF-8", $buffer->{"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($buffer->{"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 .= $buffer->{"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
 {
-    weechat::bar_item_update("buffers");
+    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("buffers");
+    weechat::bar_item_update($SCRIPT_NAME);
     return weechat::WEECHAT_RC_OK;
 }
 
 
 sub buffers_signal_config_whitelist
 {
-    @whitelist_buffers = split( /,/, weechat::config_string( $options{"color_whitelist_buffers"} ) );
-    weechat::bar_item_update("buffers");
+    @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("buffers");
+    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 ccured
+# 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 "buffers") && ($item_line >= 0) && ($item_line <= $#buffers_focus))
+    if (($info{"_bar_item_name"} eq $SCRIPT_NAME) && ($item_line >= 0) && ($item_line <= $#buffers_focus))
     {
         $hash = $buffers_focus[$item_line];
     }
@@ -599,28 +1226,144 @@
 }
 
 # called when a mouse action is done on buffers item, to execute action
-# action can be: jump to a buffer, or move buffer in list (drag & drop of buffer)
+# 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]});
-    if ($hash{"number"} eq $hash{"number2"})
+    my $current_buffer = weechat::buffer_get_integer(weechat::current_buffer(), "number"); # get current buffer number
+
+    if ( $hash{"_key"} eq "button1" )           # left mouse button
     {
-        weechat::command("", "/buffer ".$hash{"full_name"});
+        if ($hash{"number"} eq $hash{"number2"})
+        {
+            if ( weechat::config_integer($options{"jump_prev_next_visited_buffer"}) eq 1 )
+            {
+                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_integer($options{"jump_prev_next_visited_buffer"}) eq 1) )# right mouse button
+    {
+        if ( $current_buffer eq $hash{"number2"} )
+        {
+            weechat::command("","/input jump_next_visited_buffer");
+        }
     }
     else
     {
-        my $number2 = $hash{"number2"};
-        if ($number2 eq "?")
+        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 number 2 is not known (end of gesture outside buffers list), then set it
-            # according to mouse gesture
-            $number2 = "999999";
-            $number2 = "1" if (($hash{"_key"} =~ /gesture-left/) || ($hash{"_key"} =~ /gesture-up/));
+            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}")
+            }
         }
-        my $ptrbuf = weechat::current_buffer();
-        weechat::command("", "/buffer ".$hash{"number"});
-        weechat::command("", "/buffer move ".$number2);
-        weechat::buffer_set($ptrbuf, "display", "1");
+        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;
+}
--- a/weechat/plugins.conf	Wed Feb 19 15:40:37 2014 -0500
+++ b/weechat/plugins.conf	Wed Feb 19 15:49:21 2014 -0500
@@ -1,5 +1,5 @@
 #
-# plugins.conf -- weechat v0.4.1
+# plugins.conf -- weechat v0.4.2
 #
 
 [var]
--- a/weechat/relay.conf	Wed Feb 19 15:40:37 2014 -0500
+++ b/weechat/relay.conf	Wed Feb 19 15:49:21 2014 -0500
@@ -1,5 +1,5 @@
 #
-# relay.conf -- weechat v0.4.1
+# relay.conf -- weechat v0.4.2
 #
 
 [look]
--- a/weechat/rmodifier.conf	Wed Feb 19 15:40:37 2014 -0500
+++ b/weechat/rmodifier.conf	Wed Feb 19 15:49:21 2014 -0500
@@ -1,5 +1,5 @@
 #
-# rmodifier.conf -- weechat v0.4.1
+# rmodifier.conf -- weechat v0.4.2
 #
 
 [look]
--- a/weechat/script.conf	Wed Feb 19 15:40:37 2014 -0500
+++ b/weechat/script.conf	Wed Feb 19 15:49:21 2014 -0500
@@ -1,5 +1,5 @@
 #
-# script.conf -- weechat v0.4.1
+# script.conf -- weechat v0.4.2
 #
 
 [look]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/weechat/sec.conf	Wed Feb 19 15:49:21 2014 -0500
@@ -0,0 +1,11 @@
+#
+# sec.conf -- weechat v0.4.2
+#
+
+[crypt]
+cipher = aes256
+hash_algo = sha256
+passphrase_file = ""
+salt = on
+
+[data]
--- a/weechat/urlgrab.conf	Wed Feb 19 15:40:37 2014 -0500
+++ b/weechat/urlgrab.conf	Wed Feb 19 15:49:21 2014 -0500
@@ -1,5 +1,5 @@
 #
-# urlgrab.conf -- weechat v0.4.1
+# urlgrab.conf -- weechat v0.4.2
 #
 
 [color]
--- a/weechat/weechat.conf	Wed Feb 19 15:40:37 2014 -0500
+++ b/weechat/weechat.conf	Wed Feb 19 15:49:21 2014 -0500
@@ -1,5 +1,5 @@
 #
-# weechat.conf -- weechat v0.4.1
+# weechat.conf -- weechat v0.4.2
 #
 
 [debug]
@@ -32,7 +32,8 @@
 command_chars = ""
 confirm_quit = off
 day_change = on
-day_change_time_format = "%a, %d %b %Y"
+day_change_message_1date = "-- %a, %d %b %Y --"
+day_change_message_2dates = "-- %%a, %%d %%b %%Y (%a, %d %b %Y) --"
 eat_newline_glitch = off
 highlight = "sjl,slosh,slj,clojerks"
 highlight_regex = "(^all[,:]|backend(ia)?[^s/]|red[- ]tape|steve ?losh|rob ford|(jesus )?fucking christ)"
@@ -45,8 +46,10 @@
 hotlist_names_length = 0
 hotlist_names_level = 12
 hotlist_names_merged_buffers = off
+hotlist_prefix = "H: "
 hotlist_short_names = on
 hotlist_sort = group_time_asc
+hotlist_suffix = ""
 hotlist_unique_numbers = on
 input_cursor_scroll = 20
 input_share = none
@@ -57,6 +60,7 @@
 jump_current_to_previous_buffer = on
 jump_previous_buffer_when_closing = on
 jump_smart_back_to_buffer = on
+key_bind_safe = on
 mouse = off
 mouse_timer_delay = 100
 nick_prefix = ""
@@ -104,6 +108,7 @@
 chat_bg = default
 chat_buffer = white
 chat_channel = white
+chat_day_change = cyan
 chat_delimiters = green
 chat_highlight = 207
 chat_highlight_bg = default
@@ -137,6 +142,8 @@
 chat_time = 238
 chat_time_delimiters = 236
 chat_value = cyan
+emphasized = yellow
+emphasized_bg = magenta
 input_actions = lightgreen
 input_text_not_found = red
 nicklist_away = cyan
@@ -184,6 +191,7 @@
 connection_timeout = 60
 gnutls_ca_file = "%h/ssl/CAs.pem"
 gnutls_handshake_timeout = 30
+proxy_curl = ""
 
 [plugin]
 autoload = "*"
@@ -199,7 +207,7 @@
 buffers.conditions = ""
 buffers.filling_left_right = vertical
 buffers.filling_top_bottom = horizontal
-buffers.hidden = off
+buffers.hidden = on
 buffers.items = "buffers"
 buffers.position = left
 buffers.priority = 0
@@ -265,42 +273,6 @@
 title.type = window
 
 [layout]
-main.buffer = "core;weechat;1"
-main.buffer = "irc;server.simple;1"
-main.buffer = "irc;server.sjl;1"
-main.buffer = "irc;server.bit;1"
-main.buffer = "irc;simple.#simple;2"
-main.buffer = "irc;simple.#engineering;3"
-main.buffer = "irc;simple.#backend;4"
-main.buffer = "irc;simple.##/b/anksimple;5"
-main.buffer = "irc;simple.#c2c;6"
-main.buffer = "irc;simple.#ops;7"
-main.buffer = "irc;simple.#frontend;8"
-main.buffer = "irc;simple.#internal;9"
-main.buffer = "irc;simple.#security;10"
-main.buffer = "irc;simple.##@;11"
-main.buffer = "irc;simple.#support;12"
-main.buffer = "irc;simple.##vim;13"
-main.buffer = "irc;simple.##dance;14"
-main.buffer = "irc;simple.##adorbs;15"
-main.buffer = "irc;sjl.##simple;16"
-main.buffer = "irc;simple.##music;17"
-main.buffer = "irc;bit.&bitlbee;18"
-main.buffer = "irc;sjl.#riemann;19"
-main.buffer = "irc;sjl.#mercurial;20"
-main.buffer = "irc;sjl.#clojure;21"
-main.buffer = "irc;sjl.#weechat;22"
-main.buffer = "irc;sjl.#mutt;23"
-main.buffer = "irc;sjl.#nethack;24"
-main.buffer = "irc;sjl.#dwarffortress;25"
-main.buffer = "irc;sjl.#scala;26"
-main.buffer = "irc;sjl.#lisp;27"
-main.buffer = "irc;sjl.#vagrant;28"
-main.buffer = "irc;sjl.#amara_alumni;29"
-main.buffer = "irc;sjl.#postgresql;30"
-main.window = "1;0;0;0;irc;simple.#internal"
-main.current = on
-_zoom.window = "1;0;0;0;irc;simple.##vim"
 
 [notify]
 
@@ -573,6 +545,7 @@
 @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}"
--- a/weechat/xfer.conf	Wed Feb 19 15:40:37 2014 -0500
+++ b/weechat/xfer.conf	Wed Feb 19 15:49:21 2014 -0500
@@ -1,10 +1,11 @@
 #
-# xfer.conf -- weechat v0.4.1
+# xfer.conf -- weechat v0.4.2
 #
 
 [look]
 auto_open_buffer = on
 progress_bar_size = 20
+pv_tags = "notify_private"
 
 [color]
 status_aborted = lightred