Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
My always up-to-date WeeChat configuration (weechat-dev)

WeeChat Screenshot

You need at least WeeChat 2.7-dev

Enable mouse

/mouse enable

Secured data

/secure passphrase <pass>
/secure set freenodepass <pass>
/secure set snoonetpass <pass>
/secure set undernet_userpass <user> <pass>
/secure set undernet_secret <TOTP secret>
/secure set relaypass <pass>
/secure set mariechannel <friend's channel name>

Network

Default settings

/set irc.server_default.sasl_mechanism PLAIN
/set irc.server_default.sasl_username r3m
/set irc.server_default.nicks r3m
/set irc.server_default.capabilities "account-notify,away-notify,cap-notify,multi-prefix,server-time,znc.in/self-message"

the last line request some IRCv3 capabilities. Capabilities supported by WeeChat are: account-notify, away-notify, cap-notify, extended-join, multi-prefix, server-time, userhost-in-names. See IRCv3 Specifications to learn more about IRCv3 capabilities.

Network-specific settings

/server add freenode chat.freenode.net/6697 -ssl -autoconnect
/set irc.server.freenode.sasl_password ${sec.data.freenodepass}

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

/server add snoonet irc.snoonet.org/6697 -ssl -autoconnect
/set irc.server.snoonet.sasl_password ${sec.data.snoonetpass}

/server add tilde irc.tilde.chat/6697 -ssl -autoconnect
/set irc.server.tilde.sasl_password ${sec.data.tildepass}

/server add undernet ix.undernet.org
/set irc.server.undernet.command "/eval /mute /msg x@channels.undernet.org login ${sec.data.undernet_userpass} ${info:totp_generate,${sec.data.undernet_secret}};/quote silence *!*@*,~*!*@*.users.undernet.org${plugins.var.undernet_silence_exempt}"  

/connect -auto

The command option for the undernet network identify myself to X automatically upon connection using 2FA. WeeChat 2.4 and later versions have a TOTP generator. The silence command is a server-side ignore and will ignore everyone excepts identified users (even if the user is not +x).

Plugins

Load at startup

/set weechat.plugin.autoload "*,!guile,!javascript,!lua,!php,!tcl,!fifo,!xfer"

this will load all modules except guile, javascript, lua, php, tcl, fifo and xfer

spell

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

Set the dictionary order to fr,en

/trigger add setdict signal irc_channel_opened;irc_pv_opened;irc_server_opened
/trigger set setdict conditions "(${buffer[${tg_signal_data}].full_name} =* irc.undernet.* || (${buffer[${tg_signal_data}].full_name} =~ fr$ && ${buffer[${tg_signal_data}].local_variables.type} == channel)) && ${info:spell_dict,${buffer[${tg_signal_data}].full_name}} !~ ^fr"
/trigger set setdict command "/command -buffer ${buffer[${tg_signal_data}].full_name} * /mute /spell setdict fr,en"

This trigger set spell checker to fr,en when we join a channel with a name ending in 'fr' or when we join any channel or open any query on undernet.

Note: we will add the spell_dict and spell_suggest item to the status bar later on.

Relay

/relay sslcertkey
/relay add ssl.irc <port>
/relay add ssl.weechat <port>
/set relay.network.password ${sec.data.relaypass}

If you want a trusted certificate, use let's encrypt! with weechat relay.

Logger

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

Scripts

/script install autojoinem.py buffer_autoset.py autosort.py grep.py text_item.py

autosort.py (require setdict trigger)

/autosort helpers set french_channels_pvs_first ${if:${type}=~(channel|private)&&${info:spell_dict,${buffer.full_name}}!~^fr}
/autosort rules insert 6 ${french_channels_pvs_first}

/trigger add autosort_refresh_on_setdict config "spell.dict.*;spell.check.default_dict" "" "" "/mute autosort"

sort french channels before other channels. A french channel, in my configuration, is one with a french dictionnary as main dictionnary. This autosort rule sort channels using the main dictionnary. So you also need the trigger setdict which set the dictionnary based on channel's name (channels ending in fr). This also sort french private before other private. A french private, in my configuration, is one with a french dictionnary as main dictionnary. However, the setdict trigger do not set the french dictionnary when a private name end in fr (cause this does not make sense for private). So the only way to set a private as french is to type /spell setdict fr on a private. And if you type this command (on a private or on a channel, for example one not ending in fr) you will need the autosort_refresh_on_setdict trigger to resort the buffers.

buffer_autoset.py

/buffer_autoset add core.weechat notify 3
/buffer_autoset add irc.server.* notify 3
/buffer_autoset add relay.relay.list short_name relay

Conky

/buffer_autoset add exec.exec.conky short_name conky

exec conky at startup and right now

/set weechat.notify.exec.exec.conky none
/set weechat.startup.command_after_plugins "/exec -norc -noln -buffer conky conky"
/exec -norc -noln -buffer conky conky

change the title of the conky buffer

/buffer_autoset add exec.exec.conky title Conky - the light-weight system monitor

Change the title Executed commands to Conky - the light-weight system monitor

beautify the output

/trigger add conky modifier weechat_print
/trigger set conky conditions "${tg_buffer} == exec.exec.conky && ${tg_tags} =~ ,exec_stdout, && ${tg_message_nocolor} =~ ^[^:]+: *[^ ]"
/trigger set conky regex "/^ \t([^:]+):(.*)/ ${color:_31}${re:1}\t${color:reset}${re:2}/ /.*/${tg_message_nocolor}/my_field /.*/${tg_message_nocolor}/my_value /^([^:]+):.*/${re:1}/my_field /.*/${my_field}/my_field_with_underscore / /_/my_field_with_underscore /^[^:]+: *(.*)/${re:1}/my_value / +$//my_value /.*Load Average\t.*//"
/trigger set conky command "${if:${my_field}==Load Average?/buffer set title Conky - ${my_value}:/mute set plugins.var.python.text_item.conky_${my_field_with_underscore} all \${if:${buffer.num_displayed}==?${my_field} ${color:white}${my_value}${\x7D}}"

This trigger will change the output of conky and add/change a text_item option for each lines except load average lines. These options are actually text_item options so we can use them in a bar. We will add the items later in the item option of the status bar. These items will be shown only if the conky buffer is not visible in any windows. For load average lines, the buffer title will be changed to show the load average. Don't change .conkyrc because this trigger is tied to this particular .conkyrc (change the trigger if you change .conkyrc)

my .conkyrc

background no
cpu_avg_samples 2
net_avg_samples 2
no_buffers yes
out_to_stderr no
update_interval 1.0
uppercase no
use_spacer none

TEXT
Load Average: ${loadavg 1 2}
Uptime: $uptime
CPU: $cpu%
RAM: $memperc%
Swap: $swapperc%
Up: ${upspeed venet0}
Down: ${downspeed venet0}

Note: you need the conky-cli package on Debian

Weather with wttr.in (require utils_escape trigger)

/buffer_autoset add exec.exec.weather short_name weather
/set spell.dict.exec.exec.weather fr

/trigger add weather_cmd_weather command "weather;show the weather, using wttr.in, in a new buffer;<location>;;longueuil|montreal|quebec|paris|new+york"
/trigger set weather_cmd_weather conditions "${tg_argv_eol1}"
/trigger set weather_cmd_weather regex "/ /+/tg_argv_eol1 /.*/${info:spell_dict,exec.exec.weather}/my_lang /^([^,]+).*/${re:1}/my_lang /^$/en/my_lang"
/trigger set weather_cmd_weather command "/exec -noflush -norc -noln -buffer weather curl -s http://wttr.in/${tg_argv_eol1}?lang=${my_lang}"

I found something very similar on the alias wiki page of WeeChat on GitHub. It will open a new buffer and display the weather inside using wttr.in. I created a trigger instead so it allow me to replace space in city name with a +. As you can see on the first trigger line, I set the completion for the command to longueuil|montreal|quebec|paris|new+york. Change this to fit your needs. It will allow you to /weather <tab> for place you frequently want to see the weather. However, if the city contain a space, you must put a + instead (only in the completion, if you type /weather new york manually, the space will be replaced by a + automatically.

/trigger add weather_set_weather_buffer_title print "exec.exec.weather;exec_stdout;;1"
/trigger set weather_set_weather_buffer_title conditions "${tg_message} =~ ^\w && ${tg_message} !~ wttr\.in|@igor_chubin"
/trigger set weather_set_weather_buffer_title regex "/^[^:]+:(.*)/${re:1}/tg_message_nocolor"
/trigger set weather_set_weather_buffer_title command "/buffer set title ${tg_message};/buffer set localvar_set_weather ${tg_message_nocolor}"

I created this trigger to change the title of the buffer from Executed commands to Weather for City: Montreal, Canada.

/trigger add weather_get_weather_by_shortcut modifier input_text_for_buffer
/trigger set weather_get_weather_by_shortcut conditions "${info:ruby_version} && ${modifier:escape,'\test} == \'\\test && ${buffer[${tg_modifier_data}].full_name} == exec.exec.weather && ${info:ruby_eval,puts Weechat.string_is_command_char('${modifier:escape,${tg_string_nocolor}}').to_s} == 0"
/trigger set weather_get_weather_by_shortcut regex "==.*==/weather ${re:0}"

This trigger will allow you to enter only the city name (without /weather) in the weather buffer.

Bars

Bar buflist and buflist_hotlist (need WeeChat >= 2.7)

unmerge servers buffers from core and indent

/set irc.look.server_buffer independent

Note: show channels and privates buffers under their respective server instead of mixing them all.

/bar set buflist separator off
/bar set buflist priority 2
/bar set buflist size 15
/bar set buflist items buflist
/bar add buflist_hotlist root left 1 1 buflist2
/bar set buflist_hotlist priority 1
/bar set buflist_hotlist size 3

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

/set buflist.format.buffer "${if:${bar_item.name}==buflist?${eval:${format_name}}:${if:${bar_item.name}==buflist2?${if:${type}==server?${color:31,31}} ${eval:${format_hotlist}}}}"
/set buflist.format.buffer_current "${if:${bar_item.name}==buflist?${eval:${format_name}}:${if:${bar_item.name}==buflist2?${if:${type}==server?${color:31,31}} }}"
/set buflist.format.number "${if:${current_buffer}?${if:${type}==server?${color:*white,31}:${color:*white}}${hide:>,${number}} :${if:${type}==server?${color:black,31}:${color:239}}${number}${if:${number_displayed}?.: }}"
/set buflist.format.indent "${if:${type}==channel&&${buffer.name}=~fr$||${info:spell_dict,${buffer.full_name}}=~^fr?${color:blue}f :  }"
/set buflist.format.name "${cutscr:${calc:${weechat.bar.buflist.size} - 1},${if:${type}==server?${color:white}:${color:${weechat.color.chat_prefix_more}}}${weechat.look.prefix_align_more},${eval:${format_number}${indent}}${if:${type}==server?${color:white,31}${if:${info:irc_server_isupport_value,${name},NETWORK}?${info:irc_server_isupport_value,${name},NETWORK}:${name}}:${eval:${color_hotlist}}${name}}${color:31}${if:${buffer.local_variables.filter}${buffer.local_variables.conky_Load_Average}${buffer.local_variables.weather}${if:${buffer.full_name}==relay.relay.list?${info:relay_client_count,*,connected}}? ${buffer.local_variables.filter}${buffer.local_variables.conky_Load_Average}${buffer.local_variables.weather}${if:${buffer.full_name}==relay.relay.list?Total${\x3A}${info:relay_client_count,*,connected} IRC${\x3A}${info:relay_client_count,irc,connected} WeeChat${\x3A}${info:relay_client_count,weechat,connected}}}}"
/set buflist.format.hotlist "${if:${lengthscr: ${hotlist}} > ${weechat.bar.buflist_hotlist.size}?${cutscr:${calc:${weechat.bar.buflist_hotlist.size} - 2},${if:${type}==server?${color:white}:${color:${weechat.color.chat_prefix_more}}}${weechat.look.prefix_align_more},${hotlist}}:${repeat:${calc:${weechat.bar.buflist_hotlist.size} - 1 - ${lengthscr:${hotlist}}}, }${hotlist}}"

/set buflist.look.signals_refresh "irc_server_connected,relay_client_connected,relay_client_disconnected"

/set buflist.look.display_conditions "${buffer.hidden}==0 && (${type} !~ ^(channel|private)$ || ${type} =~ ^(channel|private)$ && ${buffer[${info:irc_buffer,${irc_server.name}}].local_variables.my_fold} == 0)"

/set weechat.look.bar_more_down ""
/set weechat.look.bar_more_up ""

/trigger add buflist_scroll_buflist command_run "/bar scroll buflist*"
/trigger set buflist_scroll_buflist regex "/.*/${tg_command}/arguments /.* ([^ ]+)$/${re:1}/arguments"
/trigger set buflist_scroll_buflist command "/bar scroll buflist * ${arguments};/bar scroll buflist_hotlist * ${arguments}"
/trigger set buflist_scroll_buflist return_code "ok_eat"

/trigger add buflist_resize_buflist config "weechat.bar.buflist.size*;weechat.bar.buflist_hotlist.size*"
/trigger set buflist_resize_buflist command "/buflist refresh"

/key bindctxt mouse @bar(buflist*):alt-wheelup /bar set ${_bar_name} size ${calc:${weechat.bar.${_bar_name}.size} - 1}
/key bindctxt mouse @bar(buflist*):alt-wheeldown /bar set ${_bar_name} size ${calc:${weechat.bar.${_bar_name}.size} + 1}

There's a lot going on here. I created a second bar, buflist_hotlist, that contain the item buflist2. This item contain only the hotlist so we can resize this bar individually from the buflist bar. The trigger will synchronise the scroll between the two bars. That is, if you scroll the buflist bar, the buflist_hotlist bar will also be scroll, and vice versa. I bind two keys, alt-wheelup and alt-wheeldown, to resize the bars.

Bar active title

/bar add activetitle window top 1 1 [#window_number],buffer_title
/bar set activetitle priority 500
/bar set activetitle conditions ${active}
/bar set activetitle color_fg white
/bar set activetitle color_bg 31

Note: This bar will be different from the already created one. I set the conditions to ${active} so this bar will be displayed on the active window only. The other one will be used for other windows.

Bar title

/bar set title conditions ${inactive}
/bar set title color_fg black
/bar set title color_bg 31
/bar set title items [#window_number],buffer_title

Bar status

/bar add rootstatus root bottom 1 1 [time],[buffer_count],[buffer_plugin],buffer_number+:+buffer_name+(buffer_modes)+{buffer_nicklist_count}+buffer_filter,[bitlbee_typing_notice],[lag],[spell_dict],[spell_suggest],completion,scroll,conky_CPU,conky_RAM,conky_Swap,conky_Up,conky_Down
/bar set rootstatus color_fg 31
/bar set rootstatus color_bg 234
/bar set rootstatus priority 500
/bar del status
/bar set rootstatus name status

Note: the built-in status bar is of type window. I prefer a status bar of type root which means it will be outside any window. At this time, you can't change the type of a bar. So we delete the status bar and create a new one.

Bar input

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

Note: the built-in input bar is of type window. I prefer a input bar of type root which means it will be outside any window. At this time, you can't change the type of a bar. So we delete the status bar and create a new one.

Bar Nicklist

/bar set nicklist color_fg 229
/bar set nicklist separator 1
/bar set nicklist conditions ${nicklist} && ${window.number} == 1 && ${buffer.full_name} !~ ^irc.freenode.(#newsbin|##news)$
/bar set nicklist size_max 14
/bar set nicklist size 14

Note: I changed the conditions to display the nicklist only on buffer of type channels ${nicklist} and on the window number 1, which is my chat window (2 being my highlight window and 3 my conky window). In my case, I could remove ${window.numer} == 1 because the highmon and exec buffer (conky) are not of type channels so ${nicklist} is enough.

Bar line_number

/bar add line_number root left 5 1 line_number
/bar set line_number hidden on

/trigger add line_number_show_bar signal input_text_changed
/trigger set line_number_show_bar conditions "${buffer[${tg_signal_data}].input_buffer} == /cursor go${esc:\x20}"
/trigger set line_number_show_bar command "/bar show line_number;/wait 10s /bar hide line_number"

/set plugins.var.python.text_item.line_number all|signal_sigwinch ${eval:${info:ruby_eval,puts (0...${info:term_height}).to_a.join('\${\n${esc:\x7D}')}}

This is inspired from the excellent vimode.py script by GermainZ. A bar with line number will be show whenever you type /cursor go and will dissapears 5 seconds later (you need to put the x coordinates before the y one (line number). example: /cursor go x,<the line number>. Of course, if you use the vimode.py script, don't add this bar to your config it will be pretty useless.

Layouts

Layout highlight-or-news

/eval /window splith ${calc:8 / ${window[gui_current_window].win_height} * 100 // 1}
/buffer add -switch highmon
/window 1
/layout store highlight-or-news

Note: Instead of having only one window, we split it to create another one that we will use to show all highlights.

Layout highlight-or-news-and-conky

/window 2
/window splitv 85
/buffer exec.conky
/window 1
/layout store highlight-or-news-and-conky

Note: split the highlight monitor window in 2 and show conky in the new one

Channel Monitor

WeeChat Screenshot

/buffer_autoset add core.chanmon title Channels Monitor

/trigger add chanmon_like print "*;irc_privmsg"
/trigger set chanmon_like conditions "${buffer.local_variables.type} == channel && ${buffer.full_name} != irc.freenode.##news"
/trigger set chanmon_like command "/print -newbuffer chanmon -tags ${tg_tags} ${cutscr:4,${color:${weechat.color.chat_prefix_more}}${weechat.look.prefix_buffer_align_more},${color:${info:nick_color_name,${server}}}${server}}${color:${info:nick_color_name,${channel}}}${channel}\t${if:${tg_tags} !~ ,irc_action,?${weechat.look.quote_nick_prefix}${tg_prefix}${color:reset}${weechat.look.quote_nick_suffix}:${tg_prefix}${color:reset}} ${tg_message}"

This trigger create a new buffer named chanmon. This buffer will contain all the messages from all the channels you are on. This is almost identical to the scripts chanmon.pl but without any options.

Highlight Monitor

/eval /set weechat.startup.command_after_plugins "${weechat.startup.command_after_plugins};/buffer add highmon"

/buffer_autoset add core.highmon title Highlight Monitor

/trigger add highmon_like print "*;irc_privmsg"
/trigger set highmon_like conditions "${tg_highlight} == 1 && ${tg_displayed} == 1 && ${buffer.local_variables.type} == channel"
/trigger set highmon_like command "/print -newbuffer highmon -tags ${tg_tags} ${cutscr:4,${color:${weechat.color.chat_prefix_more}}${weechat.look.prefix_buffer_align_more},${color:${info:nick_color_name,${server}}}${server}}${color:${info:nick_color_name,${channel}}}${channel}\t${if:${tg_tags} !~ ,irc_action,?${weechat.look.quote_nick_prefix}${tg_prefix}${color:reset}${weechat.look.quote_nick_suffix}:${tg_prefix}${color:reset}} ${tg_message}"

This trigger create a new buffer named highmon. This buffer will contain all the highlighted message from all the channels you are on. This is similar to the highmon.pl script but without any options.

News

WeeChat Screenshot

/filter add news irc.freenode.##news !nick_newsly*+!host_yano@unaffiliated/yano/bot/rssly,!irc_privmsg *
/filter add news_interest irc.freenode.##news nick_newsly*+irc_privmsg,host_yano@unaffiliated/yano/bot/rssly+irc_privmsg !^(\s|\[)(Reddit [-] /r/netsec|Wired|freenode|EFF Updates|erry's blog|techdirt|TorrentFreak|Science Daily|Hacker News|CNET|phoronix|Ars Technica|The Intercept|france24|Radio-Canada Nouvelles|Canoe|Huffington Post [-] Weird News|Journal du hacker|Futura Sciences)( \-| | |\])

##news is a channel on Freenode with a bot named newsly that display news from various sources. The first /filter command hides everything that happends on the channel except PRIVMSG from newsly. The second /filter hides every news except those from the given list.

The following triggers use the new hook_line. You must be using weechat 2.3. Otherwise, looks in the revisions to take the other version.

/trigger add news_transform line *;irc.freenode.##news;irc_privmsg+nick_newsly*
/trigger set news_transform regex "/.*/${tg_message_nocolor}/site_name /^\[([^]]+)\].*/${re:1}/site_name /.*/${tg_message_nocolor}/title /^\[[^]]+\]//title /.*/${site_name}/site_color /^([^-]+).*/${info:nick_color_name,${re:1}}/site_color /.*/${title}/url ==.*(https?://[^ ]+).*==${re:1}==url /\+/%00/url /,/%01/url /\!/%02/url /\*/%03/url /.*/${re:0}url_${url}/tags ==https?://[^ ]+ .*====title /.*/[${color:${site_color}}${site_name}${color:reset}] ${title}/message /.*//prefix"

the normal version.

/trigger add news_transform line *;irc.freenode.##news;irc_privmsg+nick_newsly*
/trigger set news_transform regex "/.*/${tg_message_nocolor}/site_name /^\[([^]]+)\].*/${re:1}/site_name /.*/${tg_message_nocolor}/title /^\[[^]]+\]//title / - / ${color:-underline} /site_name /.*/${site_name}/site_color /^([^]+).*/${info:nick_color_name,${re:1}}/site_color /.*/${title}/url ==.*(https?://[^ ]+).*==${re:1}==url /\+/%00/url /,/%01/url /\!/%02/url /\*/%03/url /.*/${re:0}url_${url}/tags ==https?://[^ ]+ .*====title /.*/${color:_black,${site_color}} ${site_name} ${color:${site_color},default}${color:reset}${title}/message /.*//prefix"

the one with powerline symbols.

These triggers will do a few things. The URL will be removed from the message and inserted, as a tag, in the tags instead. This is very useful because url are often very long. The date will also be removed from the message for similar reason. The difference between the two triggers above are the way they display the site name (refers to the screenshot above).

Note: The url and the date will not appears in log. This is a consequence of using a modifier or a line trigger.

/trigger add news_click hsignal news_click
/trigger set news_click regex "/.*,url_([^,]+).*/${re:1}/_chat_line_tags /%00/+/_chat_line_tags /%01/,/_chat_line_tags /%02/!/_chat_line_tags /%03/*/_chat_line_tags"
/trigger set news_click command "/command -buffer ${buffer.full_name} core /input insert ${if:${_key}==m?${_chat_line_message} }${_chat_line_tags}\x20"

/key bindctxt cursor @chat(irc.freenode.##news):i hsignal:news_click;/cursor stop
/key bindctxt cursor @chat(irc.freenode.##news):m hsignal:news_click;/cursor stop

/buffer_autoset add irc.freenode.##news highlight_words_del $nick

This trigger will be triggered when we press 'i' or 'm' on a news in cursor mode (in general we invoke this with the middle mouse button). 'i' insert the URL in the input bar. If the URL is too long to view it all, simply press return to send it to the channel, which anyway is +m so nobody will see it, and press alt+l to go in bare mode (so you can click on the URL). 'm' is more interesting, generally when you press 'm' in cursor mode, you add the message in the input bar, but remember, the message does not contain the URL anymore, so it is useless to send the title to someone without the URL. So, in this channel, 'm' is different. The URL is added back to the message.

If you wonder why I replace +,*,! and comma from the url, it is because those have a special meaning in the tag mechanism or in /filter and it will be hard to, for example, filter on a tag containing a comma. I replace them by ASCII control characters in percent-encoding style. At first, I was replacing them by their equivalent percent-encoding style so for example + became %2B. The problem is that we must replace %2B by + when we retrieve the url from the tag later, because a + have a special meaning in url but not %2B (so this will not be the same url). But this will replace any %2B to +, even those that was originally %2B not +. So, instead, I use the first four ASCII control characters (in uri escape form) for +,*,! and comma. Therefore, this will replace + by %00 , by %01 ! by %02 and * by %03, then when you press 'i' in cursor mode, the %00 will become +, %01 will become , and so on. The last line disable highlight for your nick on this channel.

nullpointer (https://0x0.st)

WeeChat Screenshot

/alias add nullpointer /exec -sh -hsignal nullpointer $* 2>&1 | curl -sfSF file=@- https://0x0.st
/trigger add nullpointer hsignal nullpointer
/trigger set nullpointer regex "/\n//out"
/trigger set nullpointer command "/command -buffer ${buffer.full_name} core /input delete_line;/command -buffer ${buffer.full_name} core /input insert ${out}"

This allow you to type /nullpointer uptime for example, to send the output of the uptime command to 0x0.st. Your input bar content will be replaced by the url of the paste. This way you can visit the URL to see if there is sensitive information before giving the url to everyone. You may wonder why I didn't used something like: _/exec -sh -pipe "/input delete_line;/input insert " $* 2>&1 | curl -sF c=@- https://0x0.st Well If we use this, the input bar will be filled with the command and not the url.

Dev info

WeeChat Screenshot

/trigger add devinfo hsignal devinfo
/trigger set devinfo conditions ${err}==
/trigger set devinfo regex "/([0-9]{4})-01-([0-9]{2})/January ${re:2} ${re:1}/out /([0-9]{4})-02-([0-9]{2})/February ${re:2} ${re:1}/out /([0-9]{4})-03-([0-9]{2})/March ${re:2} ${re:1}/out /([0-9]{4})-04-([0-9]{2})/April ${re:2} ${re:1}/out /([0-9]{4})-05-([0-9]{2})/May ${re:2} ${re:1}/out /([0-9]{4})-06-([0-9]{2})/June ${re:2} ${re:1}/out /([0-9]{4})-07-([0-9]{2})/July ${re:2} ${re:1}/out /([0-9]{4})-08-([0-9]{2})/August ${re:2} ${re:1}/out /([0-9]{4})-09-([0-9]{2})/September ${re:2} ${re:1}/out /([0-9]{4})-10-([0-9]{2})/October ${re:2} ${re:1}/out /([0-9]{4})-11-([0-9]{2})/November ${re:2} ${re:1}/out /([0-9]{4})-12-([0-9]{2})/December ${re:2} ${re:1}/out /.*/\n${out}/out /.*/${out}/stable /.*/${out}/stable_date /.*/${out}/devel /.*/${out}/next_stable_date /.*\nstable:([^\n]+).*/The stable version of WeeChat is ${re:1}./stable /.*\nstable_date:([^\n]+).*/It is the stable version since ${re:1}${info:ruby_eval,require 'date'; print ' (' + (Date.today.mjd - Date.parse('${re:1}').mjd).to_s + ' days)'}./stable_date /.*\ndevel:([^\n]+).*/The devel version of WeeChat is ${re:1}./devel /.*\nnext_stable_date:([^\n]+).*/The next stable should be release around ${re:1}${info:ruby_eval,require 'date'; print ' (' + (Date.parse('${re:1}').mjd - Date.today.mjd).to_s + ' days)'}./next_stable_date"
/trigger set devinfo command "/command -buffer ${buffer.full_name} * /say ${stable} ${stable_date} ${devel} ${next_stable_date}"

/alias add devinfo /exec -norc -timeout 5 -hsignal devinfo url:https://weechat.org/dev/info/all/    

Thi alias send info about the current stable version of WeeChat and the next stable to the channel. The alias call exec and the output of exec is send as a hsignal. So the trigger handle the output.

translate with translate-shell (need the utils_escape_shell_single_quote trigger)

WeeChat Screenshot

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

/key bindctxt cursor @chat(*):t /window ${_window_number};/command -buffer ${_buffer_full_name} * /exec -norc -name translated_text trans -brief -target fr -no-auto '${modifier:escape_shell_single_quote,${_chat_line_message}}';/cursor stop
/key bindctxt cursor @chat(*):l /window ${_window_number};/command -buffer ${_buffer_full_name} * /exec -norc -name translated_lang trans -brief -no-auto -id '${modifier:escape_shell_single_quote,${_chat_line_message}}';/cursor stop
/key bindctxt cursor @chat(*):d /window ${_window_number};/command -buffer ${_buffer_full_name} * /exec -norc -name translated_dict -n trans -dictionary -no-auto '${modifier:escape_shell_single_quote,${_chat_word}}';/cursor stop

This let you translate text with the translate-shell program (package has the same name, at least for Debian). If you want to translate something someone said, press the middle mouse button on the message then press 't'. If you want to know the language of the text, press 'l' instead. Finally, you can press 'd' this will open a buffer and call translate-shell in dictionary mode. The trigger will beautify the output of translate-shell.

Highlight

/set weechat.look.highlight *pascalpoitras*
/buffer_autoset add irc.bitlbee.#twitter_pascalpoitras* highlight_words freenode,snoonet,*weechat*
/buffer_autoset add irc.bitlbee.#LET highlight_regex .*
/buffer_autoset add irc.bitlbee.#deals highlight_regex .*
/buffer_autoset add irc.freenode.##reddit-hockey highlight_regex (^GOAL: MTL.*|^Le But: MTL.*)

Triggers

Upgrade Scripts

/trigger add day_changed_upgrade_scripts signal day_changed
/trigger set day_changed_upgrade_scripts command "/script update;/wait 10s /script upgrade"

This trigger will update the local script cache and then upgrade all the installed scripts at midnight.

Friend Birthday

/trigger add day_changed_friend_birthday signal day_changed
/trigger set day_changed_friend_birthday conditions "${tg_signal_data} =~ 03-22$"
/trigger set day_changed_friend_birthday command "/msg -server freenode ${sec.data.mariechannel} BONNNE FÊTEEEE!!! BON ${calc:${date:%Y} - 1984}ieme anniversaire!!!"

This trigger will be triggered the March 22 of each years at midnight to tell my friend "happy birthday"

Holiday Friend

/trigger add day_changed_holiday_friend signal day_changed
/trigger set day_changed_holiday_friend conditions "${info:holiday,${date:%d-%m}}"
/trigger set day_changed_holiday_friend command "/msg -server freenode ${sec.data.mariechannel} ${info:holiday,${date:%d-%m}}"

This trigger will check if today is a holiday (using the utils_holiday trigger so you need to add it. You can find it in the next section.) if so, I will tell my friend Merry Christmas, or Happy new year (so she can't be angry).

Nick Validation

WeeChat Screenshot

/trigger add modifier_is_nick_valid modifier input_text_display 
/trigger set modifier_is_nick_valid conditions "${tg_string_nocolor} =~ ^/nick .+ && ${buffer.plugin.name} == irc"
/trigger set modifier_is_nick_valid regex "==/nick (.+)==${re:1}==tg_string_nocolor ===/nick (.+)===/nick ${if:${info:irc_is_nick,${tg_string_nocolor}}&&${cut:${info:irc_server_isupport_value,${server},NICKLEN},,${tg_string_nocolor}}==${tg_string_nocolor}?${color:*green}:${color:*red}}${re:1}      -- NICKLEN:${color:-bold} ${info:perl_eval,print ${info:irc_server_isupport_value,${server},NICKLEN} - (${buffer.input_buffer_length} - 6) . ' /'} ${info:irc_server_isupport_value,${server},NICKLEN}  ${color:bold}Allowed Chars: ${color:-bold}${esc:a-zA-Z0-9_-\[]{}^`|}===tg_string"

This trigger will give you hint about max nickname length and available character in nickname and will also tell you if the nick is valid (green) or not (red). Note that it doesn't works with -all option of the /nick command.

No notify for duck hunt commands

/trigger add no_notify_duck_command line *;irc.*;irc_privmsg
/trigger set no_notify_duck_command conditions "${tg_message_nocolor} =~ ^[!,.](bef|bang|reload|shop|duckstats|friends|killers)(\s|$) && ${buffer.local_variables.type} == channel"
/trigger set no_notify_duck_command regex "/.*/-1/notify_level"

Disable notify for duck hunt commands like bef, bang, reload and so on. This way I know there is nothing worth reading on a channel so I don't switch to that buffer.

escape

/trigger add utils_escape modifier escape
/trigger set utils_escape conditions "${tg_string}"
/trigger set utils_escape regex "==\\\\==\\\\== /'/\'/"

This modifier is used to escape single quote and backslash before giving a single quoted string to ruby. I prefer to reuse the regex in other trigger instead of using this modifier, this way the other trigger works even if you dont have this one. But sometimes I need to use this, for example in the buflist.

example: /eval -n ${info:ruby_eval,puts '${modifier:escape,,Hi' Everyone}'} will result in Hi' Everyone

escape shell single quote

/trigger add utils_escape_shell_single_quote modifier escape_shell_single_quote
/trigger set utils_escape_shell_single_quote conditions "${tg_string}"
/trigger set utils_escape_shell_single_quote regex "/'/'\''/"

if you use /exec with -sh and the option exec_command_shell is set to bash, escape sequence like \n will not be interpreted as a new line. This is what I want so I configured this option to bash (if you use my configuration you should do the same). In zsh, the \n will be interpreted as a new line in a single quoted string. By default the option is set to sh but on my system /bin/sh is a symbolic link to dash and dash behave like zsh. You need to keep this in mind! And don't forget, this only works for single quote string, if you want to use it in a double quote string you need to create another modifier or modify this one.

example: /eval /exec -norc -sh echo '${modifier:escape_shell_single_quote,,${plugins.var.text}}' | cowsay will display a cow saying the content of plugins.var.text option

replace

/trigger add utils_replace info replace
/trigger set utils_replace conditions "${info:ruby_version} >= 1.9 && ${tg_arguments} =~ ^[^]^-][^${cutscr:1,,${tg_arguments}}]+[${cutscr:1,,${tg_arguments}}][^${cutscr:1,,${tg_arguments}}]*[${cutscr:1,,${tg_arguments}}].+$"
/trigger set utils_replace regex "==\\\\==\\\\==tg_arguments /'/\'/tg_arguments /.*/${info:ruby_eval, arguments = '${tg_arguments}'.force_encoding("utf-8")[1..-1].split('${tg_arguments}'.force_encoding("utf-8")[0], 3); puts arguments[2].gsub(Regexp.new(arguments[0]), arguments[1])}/tg_info"

Replace any match (global) of the pattern (argument #1) to the replacement given by argument #2 in the string (argument #3)

example: /eval ${info:replace,,[aeiou],*,hello} will return h*ll*.

you can use a different delimiter (anything except ^ and ] and -) if your regex or the replacement contains a comma

example: /eval ${info:replace,#,##I like banana, apple and orange} will result in I like banana apple and orange (no comma)

And yes, you need the comma after replace (no matter the delimiter). So the syntax is ${info:replace,DELIMITERregexDELIMITERreplacementDELIMITERtext}

irc buffers stats

/trigger add utils_ircbufstats info ircbufstats
/trigger set utils_ircbufstats conditions "${tg_arguments} =~ ^(all|server|channel|private|query)$"
/trigger set utils_ircbufstats regex "/^query$/private/tg_arguments /.*/${info:ruby_eval, infolist = Weechat.infolist_get('buffer', '', ''); buffers_stats = Hash.new do |hash,key| hash[key] = 0 end; while Weechat.infolist_next(infolist) != 0 do buffer_ptr = Weechat.infolist_pointer(infolist, 'pointer'); buffers_stats[Weechat.buffer_get_string(buffer_ptr, 'localvar_type')] += 1 if Weechat.infolist_string(infolist, 'plugin_name') == 'irc' end if infolist != 0; Weechat.infolist_free(infolist); puts '${tg_arguments}' == 'all' ? [buffers_stats['server'], buffers_stats['channel'], buffers_stats['private']].join(' ') : buffers_stats['${tg_arguments}'].to_s}/tg_info"

example: /eval -n I am on ${info:ircbufstats,server} networks and ${info:ircbufstats,channel} channels with ${info:ircbufstats,private} queries will result in I am on 3 networks and 17 channels with 1 queries

example: same but faster (need the replace trigger) /eval -n ${info:replace,,([0-9]+) ([0-9]+) ([0-9]+),I am on \1 networks and \2 channels with \3 queries,${info:ircbufstats,all}}

holiday

/trigger add utils_holiday info holiday
/trigger set utils_holiday conditions "${tg_arguments} =~ ^(0[1-9]|[1-2][0-9]|3[0-1])-(0[1-9]|1[0-2])$"
/trigger set utils_holiday regex "/.*/${tg_arguments}/ /01-01/HAPPY NEW YEAR!/ /25-12/MERRY CHRISTMAS!/ /[0-9][0-9]-[0-9][0-9]//"

this info is useful for the weechat.look.day_change_message_1_date and _2dates. See these options at the bottom of my configuration. This trigger is also used from the day_changed_holiday_friend trigger.

example: /eval ${if:${info:holiday,${date:%d-%m}}?Yes! today is a holiday \o/ -- ${info:holiday,${date:%d-%m}} all!:Go to work!} will result in Yes! today is a holiday -- MERRY CHRISTMAS! all! if, of course we are December 25!

Keys

/key bindctxt cursor @item(buffer_nicklist):v /window ${_window_number};/voice ${nick}
/key bindctxt cursor @item(buffer_nicklist):o /window ${_window_number};/op ${nick}
/key bindctxt cursor @item(buffer_nicklist):V /window ${_window_number};/devoice ${nick}
/key bindctxt cursor @item(buffer_nicklist):O /window ${_window_number};/deop ${nick}
/key bindctxt cursor @chat(*):s /window ${_window_number};/slap ${_chat_line_nick};/cursor stop
/key bindctxt cursor @item(buffer_nicklist):s /window ${_window_number};/slap ${nick};/cursor stop
/key bindctxt cursor @chat(*):g /window ${_window_number};/customgrep ${_chat_line_nick};/cursor stop
/key bindctxt cursor @item(buffer_nicklist):g /window ${_window_number};/customgrep ${nick};/cursor stop
/key bind ctrl-G /bar set buflist size 15;/bar set buflist_hotlist size 4;/repeat -interval 70ms 8 /eval /bar set buflist size ${calc:${weechat.bar.buflist.size} + 1};/wait 560ms /repeat -interval 70ms 8 /eval /bar set buflist size ${calc:${weechat.bar.buflist.size} - 1};/wait 1120ms /repeat -interval 70ms 4 /eval /bar set buflist_hotlist size ${calc:${weechat.bar.buflist_hotlist.size} - 1};/wait 1400ms /repeat -interval 70ms 4 /eval /bar set buflist_hotlist size ${calc:${weechat.bar.buflist_hotlist.size} + 1};/wait 1680ms /repeat -interval 2s 2 /window zoom
/key bindctxt cursor @item(buflist):f ${if:${plugin}==irc&&${full_name}=*irc.server.*?/command -buffer ${full_name} * /buffer set localvar_set_my_fold ${if:${buffer[${info:irc_buffer,${rev:${cut:${calc:${length:${full_name}}-${length:irc.server.}},,${rev:${full_name}}}}}].local_variables.my_fold}?0:1}:/cursor stop};/cursor stop


/key bindctxt cursor @chat(*):a /command -buffer ${buffer.full_name} core /input insert ${_chat_bol}\x20;/cursor stop
/key bindctxt cursor @chat(*):e /command -buffer ${buffer.full_name} core /input insert ${_chat_eol}\x20;/cursor stop
/key bindctxt cursor @chat(*):w /command -buffer ${buffer.full_name} core /input insert ${_chat_word}\x20;/cursor stop

The ctrl-G is probably useless for you, I created this to automate the action i need to do when I create the gif at the top of the config, this resize the buflist and zoom the window so we can see that conky appears on the statusbar when window is zoomed. In the past I was using a bind to hide all channels and private buffer of a network but it was not good because if for example #weechat is supposed to be hidden all the time and then you hide every channels and privates, once you will unhide all channels, #weechat will be unhidden too. Now the 'f' key in cursor mode on buflist will hide channels and privates but not using the hidden property. So you can hide #weechat the real way with /buffer hidden and once you press F to unfold the channels and private, #weechat will remain hidden. Of course you also need to modify the option buflist.look.display_conditions to fit mine.

Others Keyboard shortcuts

/key bind meta-meta2-A /bar scroll nicklist * -100%
/key bind meta-meta2-B /bar scroll nicklist * +100%
/key bind meta2-A /input history_global_previous
/key bind meta2-B /input history_global_next

Alias

/alias add ame allchan -current /me
/alias add amsg allchan -current /msg *
/alias add cq allpv /buffer close
/alias add slap /me slaps $1- around a bit with a large trout
/alias add customgrep /input delete_line;/input insert /grep log */$server/$channel.* -a ^\[\d{2}:\d{2}:\d{2}\] <%{escape $1}>\x20
/alias add znc /quote znc
/alias add fu /say (╹◡╹)凸 $*
/alias addcompletion %(weechat_commands) multicomm /alias add temp $*;/temp
/alias add funnyversion /eval ${if:$*==?${info:ruby_eval,print %W[mIRC irssi KVIrc HexChat AdiIRC BitchX].sample}:$*} ${info:version} (git: ${info:version_git}) [compiled on ${info:date}]
/alias add savechan /allserv mute unset irc.server.$server.autojoin;/allchan mute autojoinem add;/mute unset irc.server.undernet.autojoin
/alias add change-color /fset c:${type_en} == color && ${value} == $1;/command -buffer fset.fset core /input send m:*;/fset -add -$1;/fset -add $2    

The multicomm alias is an alternative to /eval -s, but more "secure". If you use eval -s for this purpose (execute more than one command) but you forget that thing like secure variables will be evaluate this can be very bad. The change-color alias allow you to change all colors options corresponding to a certain value with another one.

The savechan alias will first remove every channels in the autojoin option (because I dont want to keep the channels that I'm not there anymore) then it add all the channels but then unset the option for undernet because I dont want to join any channel on this network (No I can't combine allserv and allchan and exclude undernet). Also note that I used allserv unset instead of unset -mask: because I don't want to remove the channels of servers I am not currently connected to.

Filters

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

Custom join color

/set weechat.color.chat_prefix_join 121
/set weechat.color.chat_host 31
/set irc.color.message_join 121

The weechat.color.chat_host option will also set this color for part and quit. To have a different color, for example, a host in red for parts and quits and green for joins, see this.

Custom part and quit

/set weechat.color.chat_prefix_quit 131
/set irc.color.message_quit 131

exec options

/set exec.command.shell bash

The remaining IRC options

/set irc.server_default.away_check 5
/set irc.server_default.away_check_max_nicks 25
/set irc.color.nick_prefixes "q:lightred;a:lightcyan;o:121;h:lightmagenta;v:229;*:lightblue"
/set irc.network.ban_mask_default "*!*@$host"
/set irc.look.buffer_switch_autojoin off
/set irc.look.buffer_switch_join off
/set irc.look.color_nicks_in_nicklist on
/set irc.look.part_closes_buffer on

The remaining Weechat options

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


/set weechat.color.bar_more 229
/set weechat.color.chat_highlight lightred
/set weechat.color.chat_highlight_bg default
/set weechat.color.chat_nick_colors "cyan,magenta,green,brown,lightblue,lightcyan,lightmagenta,lightgreen,blue"
/set weechat.color.chat_prefix_more 31
/set weechat.color.chat_prefix_suffix 31
/set weechat.color.chat_read_marker 31
/set weechat.color.chat_time 239
/set weechat.color.chat_delimiters 31
/set weechat.color.separator 31
/set weechat.color.status_data_highlight 163
/set weechat.color.status_data_msg 229
/set weechat.color.status_data_private 121
/set weechat.color.status_more 229
/set weechat.color.status_name 121
/set weechat.color.status_name_ssl 121

The following command will let you run all the commands of my configuration (not really recommended, you should take only what you want and understand)

First, type the following

/secure passphrase <pass>
/secure set freenodepass <pass>
/secure set snoonetpass <pass>
/secure set tildepass <pass>
/secure set undernet_userpass <user> <pass>
/secure set undernet_secret <TOTP secret>
/secure set relaypass <pass>
/script install autojoinem.py buffer_autoset.py autosort.py grep.py text_item.py
/secure set mariechannel <buffer fullname of my friend's channel>

Once scripts are installed

/exec -sh -oc curl -sfS https://gist.githubusercontent.com/pascalpoitras/8406501/raw/myweechat.md | sed -E 's/^\s+//;/^(\/secure|\/script|\/ruby)/d;/^\//!d'
@jmcbee

This comment has been minimized.

Copy link

jmcbee commented Nov 5, 2014

r3m/freenode:${sec.data.bncpass} what does this mean?

@pascalpoitras

This comment has been minimized.

Copy link
Owner Author

pascalpoitras commented Nov 6, 2014

This is my encrypted ZNC password in sec.conf

@Axighi

This comment has been minimized.

Copy link

Axighi commented Apr 17, 2015

how to run this script?

@pascalpoitras

This comment has been minimized.

Copy link
Owner Author

pascalpoitras commented Apr 19, 2015

Just copy all the line and paste it in weechat and press ctrl+y
dont forget : some lines need change

@jcvfen

This comment has been minimized.

Copy link

jcvfen commented Jul 26, 2015

nothing happens in buffer when i do /buffer exec.conky
I do have conky installed with ur conkyrc

@cyberviking

This comment has been minimized.

Copy link

cyberviking commented Mar 13, 2016

Look awesome, but why not share your .weechat folder ? Everything is inside, am i wrong ?

@pascalpoitras

This comment has been minimized.

Copy link
Owner Author

pascalpoitras commented Mar 15, 2016

@jcvfen you need to enable transparency to see the conky. (the conky is on the desktop not in weechat)
@cyberviking you're right but I think it is more useful to know how to use the commands

@Grogglex

This comment has been minimized.

Copy link

Grogglex commented Apr 18, 2017

@pascalpoitras Is pushover working in the latest WeeChat Dev? I've copied your config but push notifications don't seem to be working.

@pascalpoitras

This comment has been minimized.

Copy link
Owner Author

pascalpoitras commented Apr 19, 2017

@Grogglex yes it works here with the latest dev

WeeChat 1.8-dev (git: v1.7-147-g084f9d7) [compiled on Apr 18 2017 14:44:47]
I also upgrade all script at midnight

do you use pushbullet?

@ralphee

This comment has been minimized.

Copy link

ralphee commented Apr 23, 2017

@pascalpoitras i had to do a fresh install....i copied my .weechat folder ...installed weechat and copied my folder back....unfortunately weechat just opens as a fresh start....any pointers form you or anyone welocme!!!

@pascalpoitras

This comment has been minimized.

Copy link
Owner Author

pascalpoitras commented Apr 23, 2017

@ralpheeee88 you did the right steps, are you sure you didn't put the .weechat backup inside .weechat like so ~/.weechat/.weechat ?

@PowerSchill

This comment has been minimized.

Copy link

PowerSchill commented May 11, 2017

Is there a way to hide inactive buffers? I've used the buffer_autoclose script in the past but it doesn't appear to work with buflist. Sometimes I want to be able to focus on only the buffers that have had activity.

@pascalpoitras

This comment has been minimized.

Copy link
Owner Author

pascalpoitras commented May 12, 2017

@PowerSchill
There's probably a better way (like really using the API) but you can do this way:

This trigger will unhide hidden buffers whenever a message is received

/trigger addreplace reattach print "" "${buffer.hidden} == 1 && ${tg_tag_notify} == message" "" "/command -buffer irc.$server.$channel core /buffer unhide"

replace message by all or highlight if you want

then you can create another trigger (type timer) that will check each ten seconds (10000) if any of the channels had no activity since 100 seconds

/trigger addreplace detach timer 10000;0;0 "" "" "/allchan /eval /perlexec weechat::command('', '/command -buffer irc.\${server}.\${channel} core /buffer hide') if ((${date:%s} - \${buffer[\${info:irc_buffer,\${server},\${channel}}].lines.last_line.data.date}) > 100)"

it works here on the dev version, but use it at your own risk, I dont tested it a lot

@StarlitGhost

This comment has been minimized.

Copy link

StarlitGhost commented May 19, 2017

I made a small modification so it doesn't hide the buffer you currently have focused:

/trigger addreplace detach timer 10000;0;0 "" "" "/allchan /eval /perlexec weechat::command('', '/command -buffer irc.\${server}.\${channel} core /buffer hide') if ((${date:%s} - \${buffer[\${info:irc_buffer,\${server},\${channel}}].lines.last_line.data.date}) > 100 && '\${window.buffer.full_name}' !~ 'irc.\${server}.\${channel}')

(I just added && '\${window.buffer.full_name}' !~ 'irc.\${server}.\${channel}' to the condition)

I'd like to stop it hiding buffers which are in the hotlist, too, but I haven't figured that out yet.

@StarlitGhost

This comment has been minimized.

Copy link

StarlitGhost commented May 19, 2017

Got the hotlist via perlexec:

/perlexec my $h = weechat::infolist_get('hotlist', '', ''); my $hotlist; while(weechat::infolist_next($h)) { $hotlist.=weechat::infolist_string($h, "buffer_name")." "; } weechat::infolist_free($h); weechat::print($buffer, $hotlist);

Attempting to use this in the trigger via && index($hotlist, '\${server}.\${channel}') == -1 isn't working though - buffers on the hotlist are still being hidden.

Full attempt:
/trigger addreplace detach timer 10000;0;0 "" "" "/allchan /eval /perlexec my $hotlist = weechat::infolist_get('hotlist', '', '')\; my $h\; while(weechat::infolist_next($hotlist)) { $h.=weechat::infolist_string($hotlist, 'buffer_name').' '\; } weechat::infolist_free($hotlist)\; weechat::command('', '/command -buffer irc.\${server}.\${channel} core /buffer hide') if ((${date:%s} - \${buffer[\${info:irc_buffer,\${server},\${channel}}].lines.last_line.data.date}) > 100 && '\${window.buffer.full_name}' !~ 'irc.\${server}.\${channel}' && index($h, '\${server}.\${channel}') == -1)"

Getting a little unwieldy now, heh.

@pascalpoitras

This comment has been minimized.

Copy link
Owner Author

pascalpoitras commented May 19, 2017

@matthewcox nice works, for the hotlist you can use this

'${buffer[${info:irc_buffer,${server},${channel}}].hotlist}' ne '0x0')

to test if the buffer is in the hotlist

@StarlitGhost

This comment has been minimized.

Copy link

StarlitGhost commented May 19, 2017

Well now, that's much simpler. Thanks!

Final complete trigger, which hides buffers after 100 seconds of inactivity if they both aren't the current buffer and are not in the hotlist:

/trigger addreplace detach timer 10000;0;0 "" "" "/allchan /eval /perlexec weechat::command('', '/command -buffer irc.\${server}.\${channel} core /buffer hide') if ((${date:%s} - \${buffer[\${info:irc_buffer,\${server},\${channel}}].lines.last_line.data.date}) > 100 && '\${window.buffer.full_name}' !~ 'irc.\${server}.\${channel}' && '\${buffer[\${info:irc_buffer,\${server},\${channel}}].hotlist}' eq '0x0')"

And I look forward to jettisoning all of this once buflist supports it natively :)

@PentSec

This comment has been minimized.

Copy link

PentSec commented Jun 11, 2017

i can see your color conf. i put all command, but i can see the same colors of my terminal, I hope can you help me.

@pascalpoitras

This comment has been minimized.

Copy link
Owner Author

pascalpoitras commented Jun 11, 2017

@PentSec are you talking about the background color? it's the background color of my terminal (urxvt), I use the famous solarized dark color scheme, otherwise I always use these color : 31, 121, 229 in weechat

@Drowze

This comment has been minimized.

Copy link

Drowze commented Nov 14, 2017

/set irc.look.server_buffer independent

Why isn't this the default?! Thank you for your gist! Was really helpful 👍

@pascalpoitras

This comment has been minimized.

Copy link
Owner Author

pascalpoitras commented Nov 14, 2017

@Drowze Thanks! When servers buffers are merged with core you can use CTRL+X to cycle through them, which may be useful, there is probably other reason that I'm not aware of

@felipemeamaral

This comment has been minimized.

Copy link

felipemeamaral commented Nov 16, 2017

@pascalpoitras I'm trying to do the same as you but just with the users nicks in every channel.

E.g. Take the user nick color as the background of the message and insert a powerline glyph at the end.
Like you did with the #news buffer.

If you could help I'll be very glad, my friend.
Thank you for sharing your knowledge with us.

@pascalpoitras

This comment has been minimized.

Copy link
Owner Author

pascalpoitras commented Nov 16, 2017

@pulgalipe thanks! here is a minimal solution just to help you get started:

/trigger add plsymbol_nick modifier weechat_print
/trigger set plsymbol_nick conditions "${tg_tags} =~ ,irc_privmsg,"
/trigger set plsymbol_nick regex "/.*/${color:black,${info:nick_color_name,${tg_prefix_nocolor}}}${tg_prefix_nocolor} ${color:reverse} ${color:reset}${tg_message}/"
@felipemeamaral

This comment has been minimized.

Copy link

felipemeamaral commented Dec 3, 2017

@pascalpoitras This is just what I was looking for.
Thank you very much. :)

@cbodden

This comment has been minimized.

Copy link

cbodden commented Dec 4, 2017

This is always a great reference. Thanks for sharing.

@pascalpoitras

This comment has been minimized.

Copy link
Owner Author

pascalpoitras commented Dec 10, 2017

@cbodden thanks!

@blazingnode

This comment has been minimized.

Copy link

blazingnode commented Jan 4, 2018

Can you explain how to fix the conky? its displaying double eth0 and double ram on weechat.

thanks

@pascalpoitras

This comment has been minimized.

Copy link
Owner Author

pascalpoitras commented Jan 4, 2018

@blazingnode I Have no idea. you should go to #conky on freenode. My config is almost identical to the default one, I just put my interface name

@vasyl83

This comment has been minimized.

Copy link

vasyl83 commented Feb 6, 2018

did a fresh install of weechat on ubuntu 16.04 (weechat version 2.0.1)
/set aspell.color.suggestions *green fails needs to be replaced with /set aspell.color.suggestion *green
next, /autosort replacements add ## # doesn't work anymore
also /buffer add -switch highmon errors out with Error with command "/buffer add -switch highmon" (help on command: /help buffer)

any idea how to correct that?

@pascalpoitras

This comment has been minimized.

Copy link
Owner Author

pascalpoitras commented Feb 6, 2018

@vasyl83 Hi, I am using the devel version of weechat, this is the reason you get an error with /buffer add (you need 2.1)
you're right for suggestion without an s, thanks I will fix that, and for autosort you,re also right, I need to change that!

so for the highmon, you can use the script highmon.pl or use the devel version of weechat

@vasyl83

This comment has been minimized.

Copy link

vasyl83 commented Feb 6, 2018

@pascalpoitras Thanks Ill switch to devel then :)

@vasyl83

This comment has been minimized.

Copy link

vasyl83 commented Feb 6, 2018

@pascalpoitras Would you mind explaining the news section a little bit?
I just want to understand how to correctly filter then news I want to see.

Also the whole coloring thing. If I want powerline colors, do I only paste last lines?

@pascalpoitras

This comment has been minimized.

Copy link
Owner Author

pascalpoitras commented Feb 6, 2018

@vasyl83 you need to modify the filter to choose which sites to hides
if you want the powerline symbol you can use (you also need a fonts that support these symbols)

/trigger add news_modifier modifier weechat_print
/trigger set news_modifier conditions "${tg_tag_nick} =~ ^newsly_? && ${tg_tags} =~ ,irc_privmsg, && ${tg_buffer} == irc.freenode.##news"
/trigger set news_modifier regex "/.*// /.*/${tg_message_nocolor}/tg_prefix /.*/${tg_message_nocolor}/tg_message /^\[[^]]+\]//tg_message /^\[([^]]+)\].*/${re:1}/tg_prefix /^([^\-]+)/${color:_black,${info:nick_color_name,${re:1}}} ${re:1}/tg_prefix / - / ${color:-underline} /tg_prefix /$/ ${color:!}/tg_prefix ==\(?https?://.*====tg_message ==.*(https?://\S+).*==${re:1}==tg_message_nocolor /\+/%2B/tg_message_nocolor /,/%2C/tg_message_nocolor /\!/%21/tg_message_nocolor /\*/%2A/tg_message_nocolor"
/trigger set news_modifier command "/print -buffer ${tg_buffer} -tags ${tg_tags},url_${tg_message_nocolor} \t${tg_prefix}${color:reset}${tg_message}"

for the filter you should look at the list of sites the bot displays news for
here

and then modify the second filter and keep the first one like it is

/filter add news irc.freenode.##news !nick_newsly+!host_yano@unaffiliated/yano/bot/rssly,!irc_privmsg *
/filter add news_interest irc.freenode.##news nick_newsly+irc_privmsg,host_yano@unaffiliated/yano/bot/rssly+irc_privmsg !^(\s|\[)(Reddit [-] /r/netsec|Wired|freenode|EFF Updates|erry's blog|techdirt|TorrentFreak|Science Daily|Hacker News|CNET|phoronix|Ars Technica|The Intercept|france24|Radio Canada|Canoe|Huffington Post [-] Weird News)( \-| | |\])

so here the second filter hide everything except the sites that are mentioned (/r/netsec/wired/freenode) and so on

@vasyl83

This comment has been minimized.

Copy link

vasyl83 commented Feb 10, 2018

@pascalpoitras
DO I need to join ##news?

@vasyl83

This comment has been minimized.

Copy link

vasyl83 commented Feb 10, 2018

also should news appear in highlight monitor? cause they don't

@pascalpoitras

This comment has been minimized.

Copy link
Owner Author

pascalpoitras commented Feb 10, 2018

@vasyl83 yes you need to join ##news
no it will not appears in highlight monitor

@weilbith

This comment has been minimized.

Copy link

weilbith commented Feb 17, 2018

Hey @pascalpoitras
First: ty very much for this awesome guide!
I've the problem, that buffers in the buflist get shorten and marked with a + char at the end. Of course I've increased the window size of the buflist, but it doesn't help. C the screenshot. How can I solve this? In fact how can I increase the number of chars used for a buffers name?

weechat_buffername_bug

@pascalpoitras

This comment has been minimized.

Copy link
Owner Author

pascalpoitras commented Feb 17, 2018

@weilbith Hi!
Yes my config do not scale very well, In fact the buffer name max length is hardcoded. You would need to change the value 8 with another number. But, in case you change the value more than once, here is a better way:

If you want to try with, for example, 12, do this

/set plugins.var.buflist_buf_max_len 12
then, we will replace the hardcoded number to ${plugins.var.buflist_buf_max_len}

/set buflist.format.name "${if:${type}==server?${color:white}:${color_hotlist}}${if:${type}==server||${type}==channel||${type}==private?${if:${cutscr:${plugins.var.buflist_buf_max_len},+,${name}}!=${name}?${cutscr:${plugins.var.buflist_buf_max_len},${color:${weechat.color.chat_prefix_more}}+,${if:${type}==server&&${info:irc_server_isupport_value,${name},NETWORK}?${info:irc_server_isupport_value,${name},NETWORK}:${name}}}:${cutscr:${plugins.var.buflist_buf_max_len}, ,${if:${type}==server&&${info:irc_server_isupport_value,${name},NETWORK}?${info:irc_server_isupport_value,${name},NETWORK} :${name} }}}:${name}}"

then, if 12 is not what you want you just have to try another value with

/set plugins.var.buflist_buf_max_len another_value

I will upgrade my buflist soon to be scalable

@weilbith

This comment has been minimized.

Copy link

weilbith commented Feb 17, 2018

@pascalpoitras

Awesome! Thank you very much.
It will need some time till I rly understand these complete format expressions. ^^

@weilbith

This comment has been minimized.

Copy link

weilbith commented Feb 17, 2018

@pascalpoitras
Hey again. Sry for being annoying, but I also adjust the nick names like u wrote for @felipemeamaral. I have some bug, where the nick name is simply empty. It seems not to correlate with specific users. For example in the screenshot this is just a bot which show messages for a GitHub repo. Means that is there no other "nick".

Furthermore I used a transparent background in my terminal (in the area of the screenshot not rly apparently, but the contrast is visible). Unfortunately the area after the arrow is black, what looks not so nice. I already tried to play with the /trigger set plsymbol_nick regex value, but don't get it working. Using the color value default to refer the command line colors, just selecting the color of the default foreground and not the background. Any idea?

weechat_nicks_missing

@pascalpoitras

This comment has been minimized.

Copy link
Owner Author

pascalpoitras commented Feb 17, 2018

@weilbith
Hi,

Could you try this for the black arrow

/trigger set plsymbol_nick regex "/.*/${color:black,${info:nick_color_name,${tg_prefix_nocolor}}}${tg_prefix_nocolor} ${color:${info:nick_color_name,${tg_prefix_nocolor}},default} ${color:reset}${tg_message}/"

For the nick, did you change something to the trigger? if so can I see the trigger? And what is the nick of the bot, I would try with a nick with similar character

@weilbith

This comment has been minimized.

Copy link

weilbith commented Feb 18, 2018

@pascalpoitras
Wow, it works! Looks quite nice now. 👍

I think it is more a problem of the Slack plugin. Sry for that.

Which documentation u could recommend, if I wan't to get on the level u r?

@pascalpoitras

This comment has been minimized.

Copy link
Owner Author

pascalpoitras commented Feb 18, 2018

@weilbith
The user guide and the plugin API reference guide available on https://weechat.org/doc/
And especially /eval and /trigger!
Also, if you use the devel version, you can use /python eval code (or perl, ruby..)

In my config, almost everything is done with /trigger, /eval and /ruby eval

@remlap

This comment has been minimized.

Copy link

remlap commented Mar 1, 2018

Hi been trying to add the powerline for nick but I would like it in the area where the quit and joins are shown as default but I am not smart enough to figure out how.

@pascalpoitras

This comment has been minimized.

Copy link
Owner Author

pascalpoitras commented Mar 1, 2018

@remlap try the example I gave to @weilbith in this comment

@remlap

This comment has been minimized.

Copy link

remlap commented Mar 1, 2018

@pascalpoitras I did and they appear after the quit and join arrow location not same place.

screenshot at 2018-03-01 13-48-34

@pascalpoitras

This comment has been minimized.

Copy link
Owner Author

pascalpoitras commented Mar 1, 2018

@remlap oh I see

First, remove the separator (the line) between prefix and message

/set weechat.look.prefix_suffix ""

Then, remove right alignment

/set weechat.look.prefix_align none

Then

/trigger set plsymbol_nick regex "/.*/${color:black,${info:nick_color_name,${tg_prefix_nocolor}}}${tg_prefix_nocolor} ${color:${info:nick_color_name,${tg_prefix_nocolor}},default}\t ${color:reset}${tg_message}/"

let me now if it works like you want

@remlap

This comment has been minimized.

Copy link

remlap commented Mar 1, 2018

That's what I needed.

Thanks for everything!

@derfalx

This comment has been minimized.

Copy link

derfalx commented Apr 17, 2018

Hi,
is there a way to use the urlselect script even if the Input-Bar is not channel-buffer specific? At the moment I am only able to select the url of the topic, but nothing from within the chat-buffer.

@pascalpoitras

This comment has been minimized.

Copy link
Owner Author

pascalpoitras commented Apr 18, 2018

@derfalx
Hi,
I never used that script, for url I use bare display
maybe the readme may help you

@derfalx

This comment has been minimized.

Copy link

derfalx commented Apr 18, 2018

@pascalpoitras
Hi,
got it :)
/urlselect activate merged does the trick.

@MatijaTerzic

This comment has been minimized.

Copy link

MatijaTerzic commented Apr 20, 2018

How to display the number of unread private messages on the buffer list ?

@pascalpoitras

This comment has been minimized.

Copy link
Owner Author

pascalpoitras commented Apr 21, 2018

@MatijaTerzic

if you use the buflist you need to put either ${hotlist} or ${format_hotlist} in the options:


buflist.format.buffer 
buflist.format.buffer_current

But I suppose you're using the buffers.pl script as hotlist is already included in the default buflist format. I highly recommend using buflist because it's faster and a lot more flexible

EDIT: I'm wrong, the default format do not include the hotlist

for buffers.pl

/set buffers.look.hotlist_counter on

@MatijaTerzic

This comment has been minimized.

Copy link

MatijaTerzic commented Apr 27, 2018

Is it possible to put the buddylist under the buflist. So let's say, buflist height middle and then under buddylist ?

@pascalpoitras

This comment has been minimized.

Copy link
Owner Author

pascalpoitras commented Apr 27, 2018

@MatijaTerzic

try /bar set buflist items buflist,buddylist

@MatijaTerzic

This comment has been minimized.

Copy link

MatijaTerzic commented Apr 27, 2018

@pascalpoitras
Tnx super !

But any change of getting a seperator in between ? ;)

@MatijaTerzic

This comment has been minimized.

Copy link

MatijaTerzic commented Apr 27, 2018

Thanks,

Is it possible to get a separtor in between ? ;)

@pascalpoitras

This comment has been minimized.

Copy link
Owner Author

pascalpoitras commented Apr 28, 2018

@MatijaTerzic
Yes!

/script install text_item.py
/set plugins.var.python.text_item.sep_buflist_buddylist all --------
/bar set buflist items buflist,sep_buflist_buddylist,buddylist
@MatijaTerzic

This comment has been minimized.

Copy link

MatijaTerzic commented Apr 28, 2018

@pascalpoitras

Fantastic, you are my hero ;) !!

Enjoying weechat so much

@MatijaTerzic

This comment has been minimized.

Copy link

MatijaTerzic commented Apr 28, 2018

@pascalpoitras

Can i also put the buddylist at the bottom of the buflist ?

@pascalpoitras

This comment has been minimized.

Copy link
Owner Author

pascalpoitras commented Apr 28, 2018

@MatijaTerzic

you're welcome

Do you mean put the buddylist bar below the buflist bar instead of puting buddylist inside buflist?

If so, note that buflist is a rootbar so it take all the place as far as I know, so I would put buddylist inside buflist as I show you earlier

@MatijaTerzic

This comment has been minimized.

Copy link

MatijaTerzic commented Apr 28, 2018

@pascalpoitras

No i mean position the buddylist at the bottom of the buflist. So channels/servers/private messages on top of the buflist and the buddylist on the bottom of the buflist

@pascalpoitras

This comment has been minimized.

Copy link
Owner Author

pascalpoitras commented Apr 28, 2018

@MatijaTerzic

That's what
/bar set buflist items buflist,buddylist
does no?

@MatijaTerzic

This comment has been minimized.

Copy link

MatijaTerzic commented Apr 28, 2018

@pascalpoitras

the /bar set ... is fine but i would like to see server/channles/private messages aligned on top of buflist and rihgt below the buddylist. What i would like if to align servers/channeles/... to to top of buflist and buddylist allign to the bottom. If you get what i am saying...

@MatijaTerzic

This comment has been minimized.

Copy link

MatijaTerzic commented Apr 28, 2018

image

I would like the buddylist on the bottom of thr buflst

@pascalpoitras

This comment has been minimized.

Copy link
Owner Author

pascalpoitras commented Apr 28, 2018

@MatijaTerzic

Oh ok!
WeeChat do not support alignement yet, it is planned for a future release

@io7m

This comment has been minimized.

Copy link

io7m commented May 8, 2018

This is impressive work!

One thing I can't work out: How is it that the settings you give for the buflist change the background color? I see plenty of references like ${color:white} and so on, but nothing that would appear to change the background...

I'm trying to set background colors for server names in the buflist.

@pascalpoitras

This comment has been minimized.

Copy link
Owner Author

pascalpoitras commented May 8, 2018

@io7m

thanks!
I am using this for server buffer ${color:*white,31}
so the fg color then a comma then the bg color (the * is not related, this is for bold)

@LUEshi42

This comment has been minimized.

Copy link

LUEshi42 commented May 10, 2018

merci !

@weilbith

This comment has been minimized.

Copy link

weilbith commented Jun 26, 2018

@pascalpoitras do have an idea how I can scroll or possible fold the buflist? Cause using several Slack groups, this heavily fill the list.

@pascalpoitras

This comment has been minimized.

Copy link
Owner Author

pascalpoitras commented Jun 27, 2018

@weilbith yes if you use my configuration you can middle click on a server buffer and press h to hide all channels and pm, then to unfold, do the same (middle click) but press H

here is the two /key command


/key bindctxt cursor @item(buflist):h /command -buffer ${full_name} irc /allchan -current buffer hide;/command -buffer ${full_name} irc /allpv -current buffer hide;/cursor stop
/key bindctxt cursor @item(buflist):H /command -buffer ${full_name} irc /allchan -current buffer unhide;/command -buffer ${full_name} irc /allpv -current buffer unhide;/cursor stop
@duckpuppy

This comment has been minimized.

Copy link

duckpuppy commented Jun 27, 2018

I think there may be an error with the news regex. When I apply that I get an error for each message (though it LOOKS ok in the channel).

12:24 =!= Error with command "/print -buffer irc.freenode.##news -tags ,irc_privmsg,notify_message,prefix_nick_2,nick_newsly,host_~newsly@unaffiliated/yano/bot/rssly,log1,,url_[Reddit - /r/politics] A reading from the Book of St. Don. https://www.newyorker.com/magazine/2018/07/02/little-st-don 2018-06-27T16:23:18 \t[Reddit - /r/politics] A reading from the Book of St. Don." (help on command: /help print)

Or did I miss some other config? It seems to not be capturing the URL and adding it as a tag properly.

@pascalpoitras

This comment has been minimized.

Copy link
Owner Author

pascalpoitras commented Jun 27, 2018

@duckpuppy

everything works fine here, sometimes, maybe once a month one message fails because the links is invalid like (tp instead of http) but except that I am unable to reproduce the problem you got.

what is your version of weechat (if you have version 1.0 (like on debian jessie) you can't use ${re:1} to refer to capture group one you need another syntax)? and do you have any modifier trigger or any script that modify the messages?

@duckpuppy

This comment has been minimized.

Copy link

duckpuppy commented Jun 28, 2018

It's pretty much every message for me. I'm running 2.1 on both OSX (installed and updated via Homebrew) and Debian Stretch (installed from weechat repo) with the same results. The weechat buffer is filled with a steady stream of errors on both OSs.

The only triggers I've ever created in weechat I took from the above config - it's new territory for me.

@duckpuppy

This comment has been minimized.

Copy link

duckpuppy commented Jun 28, 2018

This is my trigger list:

09:31
09:31 Triggers enabled
09:31 List of triggers:
09:31   beep: print =? /1
09:31   chanmon_like: print =? /1
09:31   cmd_pass: modifier(5000|input_text_display;5000|history_add;5000|irc_command_auth) ~1
09:31   highmon_like: print =? /1
09:31   hsignal_news_click: hsignal(news_click) ~1 /1
09:31   msg_auth: modifier(5000|irc_message_auth) ~1
09:31   news_modifier: modifier(weechat_print) =? ~7 /1
09:31   server_pass: modifier(5000|input_text_display;5000|history_add) ~1

There's nothing but the default triggers and the ones from this config as far as I can see.

@pascalpoitras

This comment has been minimized.

Copy link
Owner Author

pascalpoitras commented Jun 28, 2018

@duckpuppy well, chanmon_like and highmon_like are from this config, hsignal_news_click too. But as I said I can't reproduce the problem here, it works perfectly. Can you show me the trigger? /trigger input news_modifier and paste here the result. Also, in the news section in my config, there is 4 differents news output, could you try one without powerline symbol?

@weilbith

This comment has been minimized.

Copy link

weilbith commented Jul 3, 2018

I try to implement some kinda unread message counter for my statusline. My idea is to provide a python script that hooks into WeeChat and count. I found a lot about how to catch new messages and to parse them. But this would only increase the counter. Are you aware about an hook to get event that the user has read a/some message(s) to decrease the coutner?

@pascalpoitras

This comment has been minimized.

Copy link
Owner Author

pascalpoitras commented Jul 3, 2018

@weilbith there is a signal named hotlist_changed. I will give you an exemple with a trigger

/trigger add test_hotlist signal hotlist_changed "" "" "/print -core ${buffer[${tg_signal_data}].full_name}: low msg: ${buffer[${tg_signal_data}].hotlist.count}, message msg: ${buffer[${tg_signal_data}].hotlist.1|count}, highlight msg: ${buffer[${tg_signal_data}].hotlist.3|count}"

Now if you change the active buffer to one with unread messages, then look in the core buffer you should see 0 for everything, because the hotlist get clear as soon as you change to a buffer with unread messages. No way to know the previous number the buffer had so you can substract this way.

another way will be to catch the same signal and then for all channels in the infolist hotlist to look for the count and add all them together.

I'm not very good with the API, I'm more into trigger, there's probably tons of better way.

Please let me now if you find a solution!

@kalasni

This comment has been minimized.

Copy link

kalasni commented Jul 21, 2018

@pascalpoitras a lot of valuable information here.
It may not be the right place to ask this, but I would like to know what I need to have a channel in each window, something like this:
https://weechat.org/about/screenshots/weechat/weechat_2009-08-26_daemon.png/

Thanks in advance!

@pascalpoitras

This comment has been minimized.

Copy link
Owner Author

pascalpoitras commented Jul 22, 2018

@kalasni

hi and thanks!
you can do it this way

/window merge all
/buffer name_of_buffer_that_go_in_bottom_left_window
/window splitv
/buffer name_of_buffer_that_go_in_bottom_right_window
/window splith
/buffer name_of_buffer_that_go_in_middle_right_window
/window left
/window splith
/buffer name_of_buffer_that_go_in_middle_left_window
/window splith
/buffer name_of_buffer_that_go_in_top_left_window
/window right
/window splith
/buffer name_of_buffer_that_go_in_top_right_window
/window balance
/layout store six-windows

maybe there is a script or a better way to do it, honestly I always had a bit of difficulty with window splitting.

Here is the number of each window


5 | 6

4 | 3

1 | 2

@kalasni

This comment has been minimized.

Copy link

kalasni commented Jul 23, 2018

@pascalpoitras
I will try it. Thanks again.

@Soundtoxin

This comment has been minimized.

Copy link

Soundtoxin commented Aug 1, 2018

Can you tell me how I tweak the conditions for weechat beeping at me? I'm using an english word as my nickname, so I get a bunch of beeps when people use it in a sentence. I want to turn that off or make it so it only beeps when it's at the start of a line. I also want to make certain channels not notify me of new messages, for the ones I just idle in and don't read all of. The way it is now is pretty distracting.

@pascalpoitras

This comment has been minimized.

Copy link
Owner Author

pascalpoitras commented Aug 2, 2018

@Soundtoxin
You can either disable the beep trigger
/trigger disable beep

Or you can change the conditions
/set trigger.trigger.beep.conditions "new condition here"

@oldsouless

This comment has been minimized.

Copy link

oldsouless commented Aug 15, 2018

@duckpuppy did you ever resolve your issue with the news trigger; I had the exact same.

@pascalpoitras

This comment has been minimized.

Copy link
Owner Author

pascalpoitras commented Aug 16, 2018

@oldsouless
It seems on some system like FreeBSD, \S don't work, so you need to change \S+ to [^ ]+ and the trigger should works. I will upgrade the config in 2 minutes to use [^ ]+. Please, let me know if it works!

@oldsouless

This comment has been minimized.

Copy link

oldsouless commented Aug 28, 2018

@pascalpoitras unfortunately updating to \S+ to [^ ]+ doesn't resolve (it actually disables/invalidates the print entirely. Not sure if this came across from the OG issue. The properly formatted print is actually included in the error message. For example here is my latest print from your news trigger:

screen shot 2018-08-28 at 1 16 19 pm

Note that the print regex seems to be working and even includes the Powerline fonts but also contains the error message; changing the regex as you directed causes it to stop working. Thanks in advance for posting your config and helping with troubleshooting.

@pascalpoitras

This comment has been minimized.

Copy link
Owner Author

pascalpoitras commented Aug 28, 2018

@oldsouless

could you type

/trigger input news_modifier

and paste the result here

@oldsouless

This comment has been minimized.

Copy link

oldsouless commented Sep 5, 2018

/trigger add news_modifier modifier "weechat_print" "${tg_tag_nick} =~ ^newsly_? && ${tg_tags} =~ ,irc_privmsg, && ${tg_buffer} == irc.freenode.##news" "/.// /./${tg_message_nocolor}/tg_prefix /./${tg_message_nocolor}/tg_message /^[[^]]+]//tg_message /^[([^]]+)]./${re:1}/tg_prefix /^([^-]+)/${color:black,${info:nick_color_name,${re:1}}} ${re:1}/tg_prefix / - / ${color:-underline} /tg_prefix /$/ ${color:!}/tg_prefix ==(?https?://.====tg_message ==.(https?://\S+).*==${re:1}==tg_message_nocolor /+/%2B/tg_message_nocolor /,/%2C/tg_message_nocolor /!/%21/tg_message_nocolor /*/%2A/tg_message_nocolor" "/print -buffer ${tg_buffer} -tags ${tg_tags},url${tg_message_nocolor} \t${tg_prefix}${color:reset}${tg_message}" "" "none"/trigger add news_modifier modifier "weechat_print" "${tg_tag_nick} =~ ^newsly_? && ${tg_tags} =~ ,irc_privmsg, && ${tg_buffer} == irc.freenode.##news" "/.// /./${tg_message_nocolor}/tg_prefix /./${tg_message_nocolor}/tg_message /^[[^]]+]//tg_message /^[([^]]+)]./${re:1}/tg_prefix /^([^-]+)/${color:black,${info:nick_color_name,${re:1}}} ${re:1}/tg_prefix / - / ${color:-underline} /tg_prefix /$/ ${color:!}/tg_prefix ==(?https?://.====tg_message ==.(https?://\S+).*==${re:1}==tg_message_nocolor /+/%2B/tg_message_nocolor /,/%2C/tg_message_nocolor /!/%21/tg_message_nocolor /*/%2A/tg_message_nocolor" "/print -buffer ${tg_buffer} -tags ${tg_tags},url${tg_message_nocolor} \t${tg_prefix}${color:reset}${tg_message}" "" "none"

@pascalpoitras

This comment has been minimized.

Copy link
Owner Author

pascalpoitras commented Sep 6, 2018

@oldsouless you're still using \S+

type this

/trigger set news_modifier regex "/.*// /.*/${tg_message_nocolor}/tg_prefix /.*/${tg_message_nocolor}/tg_message /^\[[^]]+\]//tg_message /^\[([^]]+)\].*/${re:1}/tg_prefix /.*/${tg_prefix}/tg_prefix_nocolor /^([^\-]+).*/${info:nick_color_name,${re:1}}/tg_prefix_nocolor /^([^\-]+)/${color:_black,${info:nick_color_name,${re:1}}} ${re:1}/tg_prefix / - / ${color:-underline} /tg_prefix /$/ ${color:${tg_prefix_nocolor},default}/tg_prefix ==\(?https?://.*====tg_message ==.*(https?://[^ ]+).*==${re:1}==tg_message_nocolor /\+/%2B/tg_message_nocolor /,/%2C/tg_message_nocolor /\!/%21/tg_message_nocolor /\*/%2A/tg_message_nocolor"

@oldsouless

This comment has been minimized.

Copy link

oldsouless commented Sep 7, 2018

Yes; I tried updating to [^ ]+ but this disables the news trigger entirely; the former at least prints something. No visible error messages it just fails silently.

@pascalpoitras

This comment has been minimized.

Copy link
Owner Author

pascalpoitras commented Sep 7, 2018

@oldsouless

What is your OS and what is your WeeChat version?
Sometimes the regex need to be adjusted depending on the OS.

@oldsouless

This comment has been minimized.

Copy link

oldsouless commented Sep 11, 2018

exact same as OG issue; macosx, weechat 2.2 from brew.

@pascalpoitras

This comment has been minimized.

Copy link
Owner Author

pascalpoitras commented Sep 13, 2018

@oldsouless

Sorry, I'm out of idea :(

@112madgamer

This comment has been minimized.

Copy link

112madgamer commented Sep 17, 2018

Hi! I am loving the script it is working great and making my WeeChat look very nice. I am just having a little trouble with the news.

I have the news filtering to the sources I want but how do I get it display as seen in https://user-images.githubusercontent.com/5862986/44739040-ad251280-aac4-11e8-99da-1e3d6b7f1c15.png

Or is there a way I can get it printing in a channel like highmon?

@pascalpoitras

This comment has been minimized.

Copy link
Owner Author

pascalpoitras commented Sep 18, 2018

@112madgamer

please type this in your weechat, this will change the regex from using \S+ to [^ ]+ which seems to fix the issue for freebsd users and maybe people from other OS

/trigger set news_modifier regex "/.*// /.*/${tg_message_nocolor}/tg_prefix /.*/${tg_message_nocolor}/tg_message /^\[[^]]+\]//tg_message /^\[([^]]+)\].*/${re:1}/tg_prefix /.*/${tg_prefix}/tg_prefix_nocolor /^([^\-]+).*/${info:nick_color_name,${re:1}}/tg_prefix_nocolor /^([^\-]+)/${color:_black,${info:nick_color_name,${re:1}}} ${re:1}/tg_prefix / - / ${color:-underline} /tg_prefix /$/ ${color:${tg_prefix_nocolor},default}/tg_prefix ==\(?https?://.*====tg_message ==.*(https?://[^ ]+).*==${re:1}==tg_message_nocolor /\+/%2B/tg_message_nocolor /,/%2C/tg_message_nocolor /\!/%21/tg_message_nocolor /\*/%2A/tg_message_nocolor"

@pascalpoitras

This comment has been minimized.

Copy link
Owner Author

pascalpoitras commented Sep 18, 2018

some people seems to have issue with the "old" "news" triggers, it was working fine here and I was unable to reproduce the problem(on my debian system), seems to be happening on mac os. On FreeBSD, replacing \S+ by [^ ]+ seems to fix this (as noted on the weechat github wiki). Please also make sure to change "/print -buffer irc.freenode.##news" if you're freenode buffer is named differently. Otherwise, you could upgrade to weechat 2.3-dev to use my "new" "news" trigger but it use the same kind of regex so I guess this will still be a problem.

@112madgamer

This comment has been minimized.

Copy link

112madgamer commented Sep 18, 2018

The trouble I am having is I am not getting ##news printed into the. Buffer above the main chat buffer as seen in the first image of the gist. I should have said this in my first message but I am running Arch + WeeChat2.3-dev. I basically just want ##news printed into the buffer highmon buffer or its own news buffer.

==EDIT==

I understand the issue. Silly me in the image I am looking at the news channel is being shown in the window above.

I fixed the issue. Thank you for the awesome gist!

@pascalpoitras

This comment has been minimized.

Copy link
Owner Author

pascalpoitras commented Sep 18, 2018

@112madgamer no problem!

@112madgamer

This comment has been minimized.

Copy link

112madgamer commented Sep 18, 2018

Just one more question is the ##news stuff meant to print inside the highmon buffer?

@pascalpoitras

This comment has been minimized.

Copy link
Owner Author

pascalpoitras commented Sep 18, 2018

@112madgamer no, I just switch between ##news and highmon in the top window, I should rename the layout to reflect that. Most of the time, ##news is the active buffer in the top window, I do not have lots of highlight so I prefer to see the news there!

@112madgamer

This comment has been minimized.

Copy link

112madgamer commented Sep 19, 2018

Yeah, that was a bit confusing. I just switch the window to news also

@rgillette

This comment has been minimized.

Copy link

rgillette commented Feb 7, 2019

Hello, I first would like to think you for this guide. I have it all setup and configured. Took me a bit to get conky to compile with out X11 support on Fedora. I am running in to an issue that I cannot seem to resolve, or if it just works that way. When conky refreshes it blinks and jumps a couple lines. Its really distracting.

@pascalpoitras

This comment has been minimized.

Copy link
Owner Author

pascalpoitras commented Feb 8, 2019

hi @rgillette
No it's not supposed to do that, maybe its a terminal issue. Could you post an image I can't really visualize it

@dpeeps74

This comment has been minimized.

Copy link

dpeeps74 commented May 11, 2019

i figured out where that color was
Thanks for sharing this. I have implemented a bit of it. Didn't want to deal with solarized so i had to figure out some colors and I didn't like a lot of the changes to the bufferlist regarding hotlist (and i could never get moving the separator to happen.

My question though is this...in the buffer list the current buffer is now marked with '>>'. where is that set at? I need to make them a color or anything. i can't even figure out what buffer i'm in half the time. yes, i know i could look in the status bar but then i still have to find it in the list.

@japersson

This comment has been minimized.

Copy link

japersson commented May 30, 2019

Running weechat-devel on my rpi3b+ on raspbian and I'm trying to set this up inside a screen and im using Putty to connect to it. I've also removed conky part. But the big major things like the look and colors. I'm not having any luck with that. I have checked /color and $TERM says 256 and ALT+C inside that buffer displays basicly 256 colors.

Is it even possible to get a result like you Pascalpoitras with screen and putty? Also, is it possible to have working hyperlinks with mouse mode?

https://i.imgur.com/s6TFXVY.png

Any pointers or am I doomed to try to get your excellent look and feel?

/John

@pascalpoitras

This comment has been minimized.

Copy link
Owner Author

pascalpoitras commented May 30, 2019

@japersson

my terminal is configured to use the dark solarized scheme This scheme is also available for putty here

Let me know if this works well I never tested it personally

my TERM is set to screen-256color

for the hyperlinks, you can go in bare mode either with the default key bind alt+l or the /window bare command. Click the link then press any key to come back to normal mode. You can also use scripts (/script search url) but I prefer bare mode

@japersson

This comment has been minimized.

Copy link

japersson commented May 31, 2019

Thanks Pascalpoitras, I will try it out. I had alt+l scripted before on my old config to just be for 3 seconds and then switch it of.

/key bind meta-l /window bare 3

@pascalpoitras

This comment has been minimized.

Copy link
Owner Author

pascalpoitras commented Jun 1, 2019

@japersson I was not aware that we can put second there, WeeChat is incredibly smart
thanks for the tip!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.