Browse Source

Added weechat

main
Yigit Colakoglu 4 years ago
parent
commit
b316d43592
44 changed files with 6323 additions and 0 deletions
  1. +2
    -0
      config/.gitignore
  2. +2
    -0
      config/weechat/.gitignore
  3. +47
    -0
      config/weechat/alias.conf
  4. +24
    -0
      config/weechat/autosort.conf
  5. +40
    -0
      config/weechat/buflist.conf
  6. +18
    -0
      config/weechat/charset.conf
  7. +20
    -0
      config/weechat/colorize_nicks.conf
  8. +19
    -0
      config/weechat/exec.conf
  9. +14
    -0
      config/weechat/fifo.conf
  10. +96
    -0
      config/weechat/fset.conf
  11. +14
    -0
      config/weechat/guile.conf
  12. +205
    -0
      config/weechat/irc.conf
  13. +36
    -0
      config/weechat/logger.conf
  14. +14
    -0
      config/weechat/lua.conf
  15. +14
    -0
      config/weechat/perl.conf
  16. +89
    -0
      config/weechat/perl/atcomplete.pl
  17. +1
    -0
      config/weechat/perl/autoload/atcomplete.pl
  18. +1
    -0
      config/weechat/perl/autoload/highmon.pl
  19. +1
    -0
      config/weechat/perl/autoload/multiline.pl
  20. +1154
    -0
      config/weechat/perl/highmon.pl
  21. +782
    -0
      config/weechat/perl/multiline.pl
  22. +79
    -0
      config/weechat/plugins.conf
  23. +14
    -0
      config/weechat/python.conf
  24. +70
    -0
      config/weechat/python/aesthetic.py
  25. +472
    -0
      config/weechat/python/anotify.py
  26. +1
    -0
      config/weechat/python/autoload/aesthetic.py
  27. +1
    -0
      config/weechat/python/autoload/anotify.py
  28. +1
    -0
      config/weechat/python/autoload/autosort.py
  29. +1
    -0
      config/weechat/python/autoload/colorize_nicks.py
  30. +1
    -0
      config/weechat/python/autoload/go.py
  31. +1075
    -0
      config/weechat/python/autosort.py
  32. +409
    -0
      config/weechat/python/colorize_nicks.py
  33. +563
    -0
      config/weechat/python/go.py
  34. +59
    -0
      config/weechat/relay.conf
  35. +14
    -0
      config/weechat/ruby.conf
  36. +57
    -0
      config/weechat/script.conf
  37. BIN
      config/weechat/script/plugins.xml.gz
  38. +20
    -0
      config/weechat/sec.conf
  39. +33
    -0
      config/weechat/spell.conf
  40. +14
    -0
      config/weechat/tcl.conf
  41. +67
    -0
      config/weechat/trigger.conf
  42. +679
    -0
      config/weechat/weechat.conf
  43. +51
    -0
      config/weechat/weechat.log
  44. +49
    -0
      config/weechat/xfer.conf

+ 2
- 0
config/.gitignore View File

@ -70,3 +70,5 @@
!coc
!npm
!zsh
!weechat
!weechat/**

+ 2
- 0
config/weechat/.gitignore View File

@ -0,0 +1,2 @@
logs
logs/**

+ 47
- 0
config/weechat/alias.conf View File

@ -0,0 +1,47 @@
#
# weechat -- alias.conf
#
# WARNING: It is NOT recommended to edit this file by hand,
# especially if WeeChat is running.
#
# Use /set or similar command to change settings in WeeChat.
#
# For more info, see: https://weechat.org/doc/quickstart
#
[cmd]
AAWAY = "allserv /away"
ANICK = "allserv /nick"
BEEP = "print -beep"
BYE = "quit"
C = "buffer clear"
CHAT = "dcc chat"
CL = "buffer clear"
CLOSE = "buffer close"
EXIT = "quit"
IG = "ignore"
J = "join"
K = "kick"
KB = "kickban"
LEAVE = "part"
M = "msg"
MSGBUF = "command -buffer $1 * /input send $2-"
MUB = "unban *"
N = "names"
Q = "query"
REDRAW = "window refresh"
SAY = "msg *"
SIGNOFF = "quit"
T = "topic"
UB = "unban"
UMODE = "mode $nick"
V = "command core version"
W = "who"
WC = "window close"
WI = "whois"
WII = "whois $1 $1"
WM = "window merge"
WW = "whowas"
[completion]
MSGBUF = "%(buffers_plugins_names)"

+ 24
- 0
config/weechat/autosort.conf View File

@ -0,0 +1,24 @@
#
# weechat -- autosort.conf
#
# WARNING: It is NOT recommended to edit this file by hand,
# especially if WeeChat is running.
#
# Use /set or similar command to change settings in WeeChat.
#
# For more info, see: https://weechat.org/doc/quickstart
#
[sorting]
case_sensitive = off
debug_log = off
replacements = ""
rules = ""
signal_delay = 5
signals = "buffer_opened buffer_merged buffer_unmerged buffer_renamed"
sort_limit = 100
sort_on_config_change = on
[v3]
helpers = "{"core_first": "${if:${buffer.full_name}!=core.weechat}", "irc_raw_first": "${if:${buffer.full_name}!=irc.irc_raw}", "irc_raw_last": "${if:${buffer.full_name}==irc.irc_raw}", "hashless_name": "${info:autosort_replace,#,,${info:autosort_escape,${buffer.name}}}", "script_or_plugin": "${if:${script_name}?${script_name}:${plugin}}"}"
rules = "["${core_first}", "${info:autosort_order,${info:autosort_escape,${script_or_plugin}},core,*,irc,bitlbee,matrix,slack}", "${script_or_plugin}", "${irc_raw_first}", "${server}", "${info:autosort_order,${type},server,*,channel,private}", "${hashless_name}", "${buffer.full_name}"]"

+ 40
- 0
config/weechat/buflist.conf View File

@ -0,0 +1,40 @@
#
# weechat -- buflist.conf
#
# WARNING: It is NOT recommended to edit this file by hand,
# especially if WeeChat is running.
#
# Use /set or similar command to change settings in WeeChat.
#
# For more info, see: https://weechat.org/doc/quickstart
#
[look]
add_newline = on
auto_scroll = 50
display_conditions = "${buffer.hidden}==0"
enabled = on
mouse_jump_visited_buffer = off
mouse_move_buffer = on
mouse_wheel = on
nick_prefix = off
nick_prefix_empty = on
signals_refresh = ""
sort = "number,-active"
use_items = 1
[format]
buffer = "${format_number}${indent}${format_nick_prefix}${color_hotlist}${format_name}"
buffer_current = "${color:,blue}${format_buffer}"
hotlist = " ${color:green}(${hotlist}${color:green})"
hotlist_highlight = "${color:magenta}"
hotlist_low = "${color:white}"
hotlist_message = "${color:brown}"
hotlist_none = "${color:default}"
hotlist_private = "${color:green}"
hotlist_separator = "${color:default},"
indent = " "
lag = " ${color:green}[${color:brown}${lag}${color:green}]"
name = "${name}"
nick_prefix = "${color_nick_prefix}${nick_prefix}"
number = "${color:green}${number}${if:${number_displayed}?.: }"

+ 18
- 0
config/weechat/charset.conf View File

@ -0,0 +1,18 @@
#
# weechat -- charset.conf
#
# WARNING: It is NOT recommended to edit this file by hand,
# especially if WeeChat is running.
#
# Use /set or similar command to change settings in WeeChat.
#
# For more info, see: https://weechat.org/doc/quickstart
#
[default]
decode = "iso-8859-1"
encode = ""
[decode]
[encode]

+ 20
- 0
config/weechat/colorize_nicks.conf View File

@ -0,0 +1,20 @@
#
# weechat -- colorize_nicks.conf
#
# WARNING: It is NOT recommended to edit this file by hand,
# especially if WeeChat is running.
#
# Use /set or similar command to change settings in WeeChat.
#
# For more info, see: https://weechat.org/doc/quickstart
#
[look]
blacklist_channels = ""
blacklist_nicks = "so,root"
colorize_input = off
greedy_matching = on
ignore_nicks_in_urls = off
ignore_tags = ""
match_limit = 20
min_nick_length = 2

+ 19
- 0
config/weechat/exec.conf View File

@ -0,0 +1,19 @@
#
# weechat -- exec.conf
#
# WARNING: It is NOT recommended to edit this file by hand,
# especially if WeeChat is running.
#
# Use /set or similar command to change settings in WeeChat.
#
# For more info, see: https://weechat.org/doc/quickstart
#
[command]
default_options = ""
purge_delay = 0
shell = "${env:SHELL}"
[color]
flag_finished = lightred
flag_running = lightgreen

+ 14
- 0
config/weechat/fifo.conf View File

@ -0,0 +1,14 @@
#
# weechat -- fifo.conf
#
# WARNING: It is NOT recommended to edit this file by hand,
# especially if WeeChat is running.
#
# Use /set or similar command to change settings in WeeChat.
#
# For more info, see: https://weechat.org/doc/quickstart
#
[file]
enabled = on
path = "%h/weechat_fifo"

+ 96
- 0
config/weechat/fset.conf View File

@ -0,0 +1,96 @@
#
# weechat -- fset.conf
#
# WARNING: It is NOT recommended to edit this file by hand,
# especially if WeeChat is running.
#
# Use /set or similar command to change settings in WeeChat.
#
# For more info, see: https://weechat.org/doc/quickstart
#
[look]
auto_refresh = "*"
auto_unmark = off
condition_catch_set = "${count} >= 1"
export_help_default = on
format_number = 1
marked_string = "*"
scroll_horizontal = 10
show_plugins_desc = off
sort = "~name"
unmarked_string = " "
use_color_value = off
use_keys = on
use_mute = off
[format]
export_help = "# ${description2}"
export_option = "/set ${name} ${quoted_value}"
export_option_null = "/unset ${name}"
option1 = ""
option2 = "${marked} ${name} ${type} ${value2}${newline} ${empty_name} ${_default_value}${color:darkgray} -- ${min}..${max}${newline} ${empty_name} ${description}"
[color]
default_value = default
default_value_selected = white
description = default
description_selected = white
file = default
file_changed = brown
file_changed_selected = yellow
file_selected = white
help_default_value = white
help_description = default
help_name = white
help_quotes = darkgray
help_values = default
index = cyan
index_selected = lightcyan
line_marked_bg1 = default
line_marked_bg2 = default
line_selected_bg1 = blue
line_selected_bg2 = red
marked = brown
marked_selected = yellow
max = default
max_selected = white
min = default
min_selected = white
name = default
name_changed = brown
name_changed_selected = yellow
name_selected = white
option = default
option_changed = brown
option_changed_selected = yellow
option_selected = white
parent_name = default
parent_name_selected = white
parent_value = cyan
parent_value_selected = lightcyan
quotes = darkgray
quotes_changed = default
quotes_changed_selected = white
quotes_selected = default
section = default
section_changed = brown
section_changed_selected = yellow
section_selected = white
string_values = default
string_values_selected = white
title_count_options = cyan
title_current_option = lightcyan
title_filter = yellow
title_marked_options = lightgreen
title_sort = white
type = green
type_selected = lightgreen
unmarked = default
unmarked_selected = white
value = cyan
value_changed = brown
value_changed_selected = yellow
value_selected = lightcyan
value_undef = magenta
value_undef_selected = lightmagenta

+ 14
- 0
config/weechat/guile.conf View File

@ -0,0 +1,14 @@
#
# weechat -- guile.conf
#
# WARNING: It is NOT recommended to edit this file by hand,
# especially if WeeChat is running.
#
# Use /set or similar command to change settings in WeeChat.
#
# For more info, see: https://weechat.org/doc/quickstart
#
[look]
check_license = off
eval_keep_context = on

+ 205
- 0
config/weechat/irc.conf View File

@ -0,0 +1,205 @@
#
# weechat -- irc.conf
#
# WARNING: It is NOT recommended to edit this file by hand,
# especially if WeeChat is running.
#
# Use /set or similar command to change settings in WeeChat.
#
# For more info, see: https://weechat.org/doc/quickstart
#
[look]
buffer_open_before_autojoin = on
buffer_open_before_join = off
buffer_switch_autojoin = on
buffer_switch_join = on
color_nicks_in_names = off
color_nicks_in_nicklist = off
color_nicks_in_server_messages = on
color_pv_nick_like_channel = on
ctcp_time_format = "%a, %d %b %Y %T %z"
display_away = local
display_ctcp_blocked = on
display_ctcp_reply = on
display_ctcp_unknown = on
display_host_join = on
display_host_join_local = on
display_host_quit = on
display_join_message = "329,332,333,366"
display_old_topic = on
display_pv_away_once = on
display_pv_back = on
display_pv_warning_address = off
highlight_channel = "$nick"
highlight_pv = "$nick"
highlight_server = "$nick"
highlight_tags_restrict = "irc_privmsg,irc_notice"
item_channel_modes_hide_args = "k"
item_display_server = buffer_plugin
item_nick_modes = on
item_nick_prefix = on
join_auto_add_chantype = off
msgbuffer_fallback = current
new_channel_position = none
new_pv_position = none
nick_completion_smart = speakers
nick_mode = prefix
nick_mode_empty = off
nicks_hide_password = "nickserv"
notice_as_pv = auto
notice_welcome_redirect = on
notice_welcome_tags = ""
notify_tags_ison = "notify_message"
notify_tags_whois = "notify_message"
part_closes_buffer = off
pv_buffer = independent
pv_tags = "notify_private"
raw_messages = 256
server_buffer = merge_with_core
smart_filter = on
smart_filter_account = on
smart_filter_chghost = on
smart_filter_delay = 5
smart_filter_join = on
smart_filter_join_unmask = 30
smart_filter_mode = "+"
smart_filter_nick = on
smart_filter_quit = on
temporary_servers = off
topic_strip_colors = off
[color]
input_nick = lightcyan
item_channel_modes = default
item_lag_counting = default
item_lag_finished = yellow
item_nick_modes = default
message_account = cyan
message_chghost = brown
message_join = green
message_kick = red
message_quit = red
mirc_remap = "1,-1:darkgray"
nick_prefixes = "y:lightred;q:lightred;a:lightcyan;o:lightgreen;h:lightmagenta;v:yellow;*:lightblue"
notice = green
reason_kick = default
reason_quit = default
topic_current = default
topic_new = white
topic_old = default
[network]
autoreconnect_delay_growing = 2
autoreconnect_delay_max = 600
ban_mask_default = "*!$ident@$host"
colors_receive = on
colors_send = on
lag_check = 60
lag_max = 1800
lag_min_show = 500
lag_reconnect = 300
lag_refresh_interval = 1
notify_check_ison = 1
notify_check_whois = 5
sasl_fail_unavailable = on
send_unknown_commands = off
whois_double_nick = off
[msgbuffer]
[ctcp]
[ignore]
[server_default]
addresses = ""
anti_flood_prio_high = 2
anti_flood_prio_low = 2
autoconnect = off
autojoin = ""
autoreconnect = on
autoreconnect_delay = 10
autorejoin = off
autorejoin_delay = 30
away_check = 0
away_check_max_nicks = 25
capabilities = ""
charset_message = message
command = ""
command_delay = 0
connection_timeout = 60
default_chantypes = "#&"
ipv6 = on
local_hostname = ""
msg_kick = ""
msg_part = "WeeChat ${info:version}"
msg_quit = "WeeChat ${info:version}"
nicks = "yigit,yigit1,yigit2,yigit3,yigit4"
nicks_alternate = on
notify = ""
password = ""
proxy = ""
realname = ""
sasl_fail = continue
sasl_key = ""
sasl_mechanism = plain
sasl_password = ""
sasl_timeout = 15
sasl_username = ""
split_msg_max_length = 512
ssl = off
ssl_cert = ""
ssl_dhkey_size = 2048
ssl_fingerprint = ""
ssl_password = ""
ssl_priorities = "NORMAL:-VERS-SSL3.0"
ssl_verify = on
usermode = ""
username = "yigit"
[server]
freenode.addresses = "chat.freenode.net/6697"
freenode.proxy
freenode.ipv6
freenode.ssl = on
freenode.ssl_cert
freenode.ssl_password
freenode.ssl_priorities
freenode.ssl_dhkey_size
freenode.ssl_fingerprint
freenode.ssl_verify
freenode.password
freenode.capabilities
freenode.sasl_mechanism = plain
freenode.sasl_username = "Fr1nge"
freenode.sasl_password = "${sec.data.freenode_password}"
freenode.sasl_key
freenode.sasl_timeout
freenode.sasl_fail
freenode.autoconnect = on
freenode.autoreconnect
freenode.autoreconnect_delay
freenode.nicks = "Fr1nge"
freenode.nicks_alternate
freenode.username = "Fr1nge"
freenode.realname = "Yigit Colakoglu"
freenode.local_hostname
freenode.usermode
freenode.command
freenode.command_delay
freenode.autojoin = "#vim,#archlinux,#lf,##C,#python,##java"
freenode.autorejoin
freenode.autorejoin_delay
freenode.connection_timeout
freenode.anti_flood_prio_high
freenode.anti_flood_prio_low
freenode.away_check
freenode.away_check_max_nicks
freenode.msg_kick
freenode.msg_part
freenode.msg_quit
freenode.notify
freenode.split_msg_max_length
freenode.charset_message
freenode.default_chantypes

+ 36
- 0
config/weechat/logger.conf View File

@ -0,0 +1,36 @@
#
# weechat -- logger.conf
#
# WARNING: It is NOT recommended to edit this file by hand,
# especially if WeeChat is running.
#
# Use /set or similar command to change settings in WeeChat.
#
# For more info, see: https://weechat.org/doc/quickstart
#
[look]
backlog = 20
backlog_conditions = ""
[color]
backlog_end = default
backlog_line = default
[file]
auto_log = on
color_lines = off
flush_delay = 120
fsync = off
info_lines = off
mask = "$plugin.$name.weechatlog"
name_lower_case = on
nick_prefix = ""
nick_suffix = ""
path = "%h/logs/"
replacement_char = "_"
time_format = "%Y-%m-%d %H:%M:%S"
[level]
[mask]

+ 14
- 0
config/weechat/lua.conf View File

@ -0,0 +1,14 @@
#
# weechat -- lua.conf
#
# WARNING: It is NOT recommended to edit this file by hand,
# especially if WeeChat is running.
#
# Use /set or similar command to change settings in WeeChat.
#
# For more info, see: https://weechat.org/doc/quickstart
#
[look]
check_license = off
eval_keep_context = on

+ 14
- 0
config/weechat/perl.conf View File

@ -0,0 +1,14 @@
#
# weechat -- perl.conf
#
# WARNING: It is NOT recommended to edit this file by hand,
# especially if WeeChat is running.
#
# Use /set or similar command to change settings in WeeChat.
#
# For more info, see: https://weechat.org/doc/quickstart
#
[look]
check_license = off
eval_keep_context = on

+ 89
- 0
config/weechat/perl/atcomplete.pl View File

@ -0,0 +1,89 @@
# Copyright 2015 by David A. Golden. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
#
# ABOUT
#
# atcomplete.pl
#
# Adds nick completion when prefixed with '@' for use with IRC gateways
# for Slack, Flowdock, etc. as these require the '@' to highlight users
#
# CONFIG
#
# /set plugins.var.perl.atcomplete.enabled
#
# HISTORY
#
# 0.001 -- xdg, 2016-04-06
#
# - initial release
#
# REPOSITORY
#
# https://github.com/xdg/weechat-atcomplete
use strict;
use warnings;
my $SCRIPT_NAME = "atcomplete";
my $VERSION = "0.001";
my %options_default = (
'enabled' => ['on', 'enable completion of nicks starting with @'],
);
my %options = ();
weechat::register($SCRIPT_NAME, "David A. Golden", $VERSION,
"Apache2", "atcomplete - do nick completion following @", "", "");
init_config();
weechat::hook_config("plugins.var.perl.$SCRIPT_NAME.*", "toggle_config_by_set", "");
weechat::hook_completion("nicks", "Add @ prefix to nick completion", "complete_at_nicks", "");
sub complete_at_nicks {
my ($data, $completion_item, $buffer, $completion ) = @_;
return weechat::WEECHAT_RC_OK() unless $options{enabled} eq 'on';
my $nicklist = weechat::infolist_get("nicklist", weechat::current_buffer(), "");
if ($nicklist ne "") {
while (weechat::infolist_next($nicklist)) {
next unless weechat::infolist_string($nicklist, "type") eq "nick";
my $nick = weechat::infolist_string($nicklist, "name");
weechat::hook_completion_list_add($completion, "\@$nick", 1, weechat::WEECHAT_LIST_POS_SORT());
}
}
weechat::infolist_free($nicklist);
return weechat::WEECHAT_RC_OK();
}
sub toggle_config_by_set {
my ($pointer, $name, $value) = @_;
$name = substr($name, length("plugins.var.perl.".$SCRIPT_NAME."."), length($name));
$options{$name} = $value;
return weechat::WEECHAT_RC_OK();
}
sub init_config {
my $version = weechat::info_get("version_number", "") || 0;
foreach my $option (keys %options_default)
{
if (!weechat::config_is_set_plugin($option))
{
weechat::config_set_plugin($option, $options_default{$option}[0]);
$options{$option} = $options_default{$option}[0];
}
else
{
$options{$option} = weechat::config_get_plugin($option);
}
if ($version >= 0x00030500)
{
weechat::config_set_desc_plugin($option, $options_default{$option}[1]." (default: \"".$options_default{$option}[0]."\")");
}
}
}

+ 1
- 0
config/weechat/perl/autoload/atcomplete.pl View File

@ -0,0 +1 @@
../atcomplete.pl

+ 1
- 0
config/weechat/perl/autoload/highmon.pl View File

@ -0,0 +1 @@
../highmon.pl

+ 1
- 0
config/weechat/perl/autoload/multiline.pl View File

@ -0,0 +1 @@
../multiline.pl

+ 1154
- 0
config/weechat/perl/highmon.pl
File diff suppressed because it is too large
View File


+ 782
- 0
config/weechat/perl/multiline.pl View File

@ -0,0 +1,782 @@
use strict; use warnings;
$INC{'Encode/ConfigLocal.pm'}=1;
require Encode;
use utf8;
# multiline.pl is written by Nei <anti.teamidiot.de>
# and licensed under the under GNU General Public License v3
# or any later version
# to read the following docs, you can use "perldoc multiline.pl"
=head1 NAME
multiline - Multi-line edit box for WeeChat (weechat edition)
=head1 DESCRIPTION
multiline will draw a multi-line edit box to your WeeChat window so
that when you hit the return key, you can first compose a complete
multi-line message before sending it all at once.
Furthermore, if you have multi-line pastes then you can edit them
before sending out all the lines.
=head1 USAGE
make a key binding to send the finished message:
/key bind meta-s /input return
then you can send the multi-line message with Alt+S
=head1 SETTINGS
the settings are usually found in the
plugins.var.perl.multiline
namespace, that is, type
/set plugins.var.perl.multiline.*
to see them and
/set plugins.var.perl.multiline.SETTINGNAME VALUE
to change a setting C<SETTINGNAME> to a new value C<VALUE>. Finally,
/unset plugins.var.perl.multiline.SETTINGNAME
will reset a setting to its default value.
the following settings are available:
=head2 char
character(s) which should be displayed to indicate end of line
=head2 tab
character(s) which should be displayed instead of Tab key character
=head2 lead_linebreak
if turned on, multi-line messages always start on a new line
=head2 modify_keys
if turned on, cursor keys are modified so that they respect line
boundaries instead of treating the whole multi-line message as a
single line
=head2 magic
indicator displayed when message will be sent soon
=head2 magic_enter_time
delay after pressing enter before sending automatically (in ms), or 0
to disable
=head2 magic_paste_only
only use multi-line messages for multi-line pastes (multi-line on
enter is disabled by this)
=head2 paste_lock
time-out to detect pastes (disable the weechat built-in paste
detection if you want to use this)
=head2 send_empty
set to on to automatically disregard enter key on empty line
=head2 hide_magic_nl
whether the new line inserted by magic enter key will be hidden
=head2 weechat_paste_fix
disable ctrl-J binding when paste is detected to stop silly weechat
sending out pastes without allowing to edit them
=head2 ipl
this setting controls override of ctrl-M (enter key) by script. Turn
it off if you don't want multiline.pl to set and re-set the key binding.
=head1 FUNCTION DESCRIPTION
for full pod documentation, filter this script with
perl -pE'
(s/^## (.*?) -- (.*)/=head2 $1\n\n$2\n\n=over\n/ and $o=1) or
s/^## (.*?) - (.*)/=item I<$1>\n\n$2\n/ or
(s/^## (.*)/=back\n\n$1\n\n=cut\n/ and $o=0,1) or
($o and $o=0,1 and s/^sub /=back\n\n=cut\n\nsub /)'
=cut
use constant SCRIPT_NAME => 'multiline';
our $VERSION = '0.6.3'; # af2e0a17b659a16
weechat::register(SCRIPT_NAME,
'Nei <anti.teamidiot.de>', # Author
$VERSION,
'GPL3', # License
'Multi-line edit box', # Description
'stop_multiline', '') || return;
sub SCRIPT_FILE() {
my $infolistptr = weechat::infolist_get('perl_script', '', SCRIPT_NAME);
my $filename = weechat::infolist_string($infolistptr, 'filename') if weechat::infolist_next($infolistptr);
weechat::infolist_free($infolistptr);
return $filename unless @_;
}
{
package Nlib;
# this is a weechat perl library
use strict; use warnings; no warnings 'redefine';
## i2h -- copy weechat infolist content into perl hash
## $infolist - name of the infolist in weechat
## $ptr - pointer argument (infolist dependend)
## @args - arguments to the infolist (list dependend)
## $fields - string of ref type "fields" if only certain keys are needed (optional)
## returns perl list with perl hashes for each infolist entry
sub i2h {
my %i2htm = (i => 'integer', s => 'string', p => 'pointer', b => 'buffer', t => 'time');
local *weechat::infolist_buffer = sub { '(not implemented)' };
my ($infolist, $ptr, @args) = @_;
$ptr ||= "";
my $fields = ref $args[-1] eq 'fields' ? ${ pop @args } : undef;
my $infptr = weechat::infolist_get($infolist, $ptr, do { local $" = ','; "@args" });
my @infolist;
while (weechat::infolist_next($infptr)) {
my @fields = map {
my ($t, $v) = split ':', $_, 2;
bless \$v, $i2htm{$t};
}
split ',',
($fields || weechat::infolist_fields($infptr));
push @infolist, +{ do {
my (%list, %local, @local);
map {
my $fn = 'weechat::infolist_'.ref $_;
my $r = do { no strict 'refs'; &$fn($infptr, $$_) };
if ($$_ =~ /^localvar_name_(\d+)$/) {
$local[$1] = $r;
()
}
elsif ($$_ =~ /^(localvar)_value_(\d+)$/) {
$local{$local[$2]} = $r;
$1 => \%local
}
elsif ($$_ =~ /(.*?)((?:_\d+)+)$/) {
my ($key, $idx) = ($1, $2);
my @idx = split '_', $idx; shift @idx;
my $target = \$list{$key};
for my $x (@idx) {
my $o = 1;
if ($key eq 'key' or $key eq 'key_command') {
$o = 0;
}
if ($x-$o < 0) {
local $" = '|';
weechat::print('',"list error: $target/$$_/$key/$x/$idx/@idx(@_)");
$o = 0;
}
$target = \$$target->[$x-$o]
}
$$target = $r;
$key => $list{$key}
}
else {
$$_ => $r
}
} @fields
} };
}
weechat::infolist_free($infptr);
!wantarray && @infolist ? \@infolist : @infolist
}
## hdh -- hdata helper
## $_[0] - arg pointer or hdata list name
## $_[1] - hdata name
## $_[2..$#_] - hdata variable name
## $_[-1] - hashref with key/value to update (optional)
## returns value of hdata, and hdata name in list ctx, or number of variables updated
sub hdh {
if (@_ > 1 && $_[0] !~ /^0x/ && $_[0] !~ /^\d+$/) {
my $arg = shift;
unshift @_, weechat::hdata_get_list(weechat::hdata_get($_[0]), $arg);
}
while (@_ > 2) {
my ($arg, $name, $var) = splice @_, 0, 3;
my $hdata = weechat::hdata_get($name);
unless (ref $var eq 'HASH') {
$var =~ s/!(.*)/weechat::hdata_get_string($hdata, $1)/e;
(my $plain_var = $var) =~ s/^\d+\|//;
my $type = weechat::hdata_get_var_type_string($hdata, $plain_var);
if ($type eq 'pointer') {
my $name = weechat::hdata_get_var_hdata($hdata, $var);
unshift @_, $name if $name;
}
my $fn = "weechat::hdata_$type";
unshift @_, do { no strict 'refs';
&$fn($hdata, $arg, $var) };
}
else {
return weechat::hdata_update($hdata, $arg, $var);
}
}
wantarray ? @_ : $_[0]
}
use Pod::Select qw();
use Pod::Simple::TextContent;
## get_desc_from_pod -- return setting description from pod documentation
## $file - filename with pod
## $setting - name of setting
## returns description as text
sub get_desc_from_pod {
my $file = shift;
return unless -s $file;
my $setting = shift;
open my $pod_sel, '>', \my $ss;
Pod::Select::podselect({
-output => $pod_sel,
-sections => ["SETTINGS/$setting"]}, $file);
my $pt = new Pod::Simple::TextContent;
$pt->output_string(\my $ss_f);
$pt->parse_string_document($ss);
my ($res) = $ss_f =~ /^\s*\Q$setting\E\s+(.*)\s*/;
$res
}
## get_settings_from_pod -- retrieve all settings in settings section of pod
## $file - file with pod
## returns list of all settings
sub get_settings_from_pod {
my $file = shift;
return unless -s $file;
open my $pod_sel, '>', \my $ss;
Pod::Select::podselect({
-output => $pod_sel,
-sections => ["SETTINGS//!.+"]}, $file);
$ss =~ /^=head2\s+(.*)\s*$/mg
}
## mangle_man_for_wee -- turn man output into weechat codes
## @_ - list of grotty lines that should be turned into weechat attributes
## returns modified lines and modifies lines in-place
sub mangle_man_for_wee {
for (@_) {
s/_\x08(.)/weechat::color('underline').$1.weechat::color('-underline')/ge;
s/(.)\x08\1/weechat::color('bold').$1.weechat::color('-bold')/ge;
}
wantarray ? @_ : $_[0]
}
## read_manpage -- read a man page in weechat window
## $file - file with pod
## $name - buffer name
sub read_manpage {
my $caller_package = (caller)[0];
my $file = shift;
my $name = shift;
if (my $obuf = weechat::buffer_search('perl', "man $name")) {
eval qq{
package $caller_package;
weechat::buffer_close(\$obuf);
};
}
my @wee_keys = Nlib::i2h('key');
my @keys;
my $winptr = weechat::current_window();
my ($wininfo) = Nlib::i2h('window', $winptr);
my $buf = weechat::buffer_new("man $name", '', '', '', '');
return weechat::WEECHAT_RC_OK unless $buf;
my $width = $wininfo->{chat_width};
--$width if $wininfo->{chat_width} < $wininfo->{width} || ($wininfo->{width_pct} < 100 && (grep { $_->{y} == $wininfo->{y} } Nlib::i2h('window'))[-1]{x} > $wininfo->{x});
$width -= 2; # when prefix is shown
weechat::buffer_set($buf, 'time_for_each_line', 0);
eval qq{
package $caller_package;
weechat::buffer_set(\$buf, 'display', 'auto');
};
die $@ if $@;
@keys = map { $_->{key} }
grep { $_->{command} eq '/input history_previous' ||
$_->{command} eq '/input history_global_previous' } @wee_keys;
@keys = 'meta2-A' unless @keys;
weechat::buffer_set($buf, "key_bind_$_", '/window scroll -1') for @keys;
@keys = map { $_->{key} }
grep { $_->{command} eq '/input history_next' ||
$_->{command} eq '/input history_global_next' } @wee_keys;
@keys = 'meta2-B' unless @keys;
weechat::buffer_set($buf, "key_bind_$_", '/window scroll +1') for @keys;
weechat::buffer_set($buf, 'key_bind_ ', '/window page_down');
@keys = map { $_->{key} }
grep { $_->{command} eq '/input delete_previous_char' } @wee_keys;
@keys = ('ctrl-?', 'ctrl-H') unless @keys;
weechat::buffer_set($buf, "key_bind_$_", '/window page_up') for @keys;
weechat::buffer_set($buf, 'key_bind_g', '/window scroll_top');
weechat::buffer_set($buf, 'key_bind_G', '/window scroll_bottom');
weechat::buffer_set($buf, 'key_bind_q', '/buffer close');
weechat::print($buf, " \t".mangle_man_for_wee($_)) # weird bug with \t\t showing nothing?
for `pod2man \Q$file\E 2>/dev/null | GROFF_NO_SGR=1 nroff -mandoc -rLL=${width}n -rLT=${width}n -Tutf8 2>/dev/null`;
weechat::command($buf, '/window scroll_top');
unless (hdh($buf, 'buffer', 'lines', 'lines_count') > 0) {
weechat::print($buf, weechat::prefix('error').$_)
for "Unfortunately, your @{[weechat::color('underline')]}nroff".
"@{[weechat::color('-underline')]} command did not produce".
" any output.",
"Working pod2man and nroff commands are required for the ".
"help viewer to work.",
"In the meantime, please use the command ", '',
"\tperldoc $file", '',
"on your shell instead in order to read the manual.",
"Thank you and sorry for the inconvenience."
}
}
1
}
our $MAGIC_ENTER_TIMER;
our $MAGIC_LOCK;
our $MAGIC_LOCK_TIMER;
our $WEECHAT_PASTE_FIX_CTRLJ_CMD;
our $INPUT_CHANGED_EATER_FLAG;
our $IGNORE_INPUT_CHANGED;
our $IGNORE_INPUT_CHANGED2;
use constant KEY_RET => 'ctrl-M';
use constant INPUT_NL => '/input insert \x0a';
use constant INPUT_MAGIC => '/input magic_enter';
our $NL = "\x0a";
init_multiline();
my $magic_enter_cancel_dynamic = 1;
my $paste_undo_start_ignore_dynamic = 0;
my $input_changed_eater_dynamic = 0;
my $multiline_complete_fix_dynamic = 1;
sub magic_enter_cancel_dynamic { $magic_enter_cancel_dynamic ? &magic_enter_cancel : weechat::WEECHAT_RC_OK }
sub paste_undo_start_ignore_dynamic { $paste_undo_start_ignore_dynamic ? &paste_undo_start_ignore : weechat::WEECHAT_RC_OK }
sub input_changed_eater_dynamic { $input_changed_eater_dynamic ? &input_changed_eater : weechat::WEECHAT_RC_OK }
sub multiline_complete_fix_dynamic { $multiline_complete_fix_dynamic ? &multiline_complete_fix : weechat::WEECHAT_RC_OK }
weechat::hook_config('plugins.var.perl.'.SCRIPT_NAME.'.*', 'default_options', '');
weechat::hook_modifier('input_text_display_with_cursor', 'multiline_display', '');
weechat::hook_command_run('/help '.SCRIPT_NAME, 'help_cmd', '');
weechat::hook_command_run(INPUT_MAGIC, 'magic_enter', '');
weechat::hook_signal('input_text_*', 'magic_enter_cancel_dynamic', '');
weechat::hook_command_run('/input *', 'paste_undo_start_ignore_dynamic', '');
weechat::hook_signal('2000|input_text_changed', 'input_changed_eater_dynamic', '');
weechat::hook_signal('key_pressed', 'magic_lock_hatch', '');
# we need lower than default priority here or the first character is separated
weechat::hook_signal('500|input_text_changed', 'paste_undo_hack', '')
# can only do this on weechat 0.4.0
if (weechat::info_get('version_number', '') || 0) >= 0x00040000;
weechat::hook_command_run("1500|/input complete*", 'multiline_complete_fix_dynamic', 'complete*');
weechat::hook_command_run("1500|/input delete_*", 'multiline_complete_fix_dynamic', 'delete_*');
weechat::hook_command_run("1500|/input move_*", 'multiline_complete_fix_dynamic', 'move_*');
sub _stack_depth {
my $depth = -1;
1 while caller(++$depth);
$depth;
}
## multiline_display -- show multi-lines on display of input string
## () - modifier handler
## $_[2] - buffer pointer
## $_[3] - input string
## returns modified input string
sub multiline_display {
Encode::_utf8_on($_[3]);
Encode::_utf8_on(my $nl = weechat::config_get_plugin('char') || ' ');
Encode::_utf8_on(my $tab = weechat::config_get_plugin('tab'));
my $cb = weechat::current_buffer() eq $_[2] && $MAGIC_ENTER_TIMER;
if ($cb) {
$_[3] =~ s/$NL\x19b#/\x19b#/ if weechat::config_string_to_boolean(weechat::config_get_plugin('hide_magic_nl'));
}
if ($_[3] =~ s/$NL/$nl\x0d/g) {
$_[3] =~ s/\A/ \x0d/ if weechat::config_string_to_boolean(weechat::config_get_plugin('lead_linebreak'));
}
$_[3] =~ s/\x09/$tab/g if $tab;
if ($cb) {
Encode::_utf8_on(my $magic = weechat::config_get_plugin('magic'));
$_[3] =~ s/\Z/$magic/ if $magic;
}
$_[3]
}
## lock_timer_exp -- expire the magic lock timer
sub lock_timer_exp {
if ($MAGIC_LOCK_TIMER) {
weechat::unhook($MAGIC_LOCK_TIMER);
$MAGIC_LOCK_TIMER = undef;
}
weechat::WEECHAT_RC_OK
}
## paste_undo_stop_ignore -- unset ignore2 flag
sub paste_undo_stop_ignore {
$IGNORE_INPUT_CHANGED2 = undef;
weechat::WEECHAT_RC_OK
}
## paste_undo_start_ignore -- set ignore2 flag when /input is received so to allow /input undo/redo
## () - command_run handler
## $_[2] - command that was called
sub paste_undo_start_ignore {
return weechat::WEECHAT_RC_OK if $IGNORE_INPUT_CHANGED;
return weechat::WEECHAT_RC_OK if $_[2] =~ /insert/;
$IGNORE_INPUT_CHANGED2 = 1;
weechat::WEECHAT_RC_OK
}
## paste_undo_hack -- fix up undo stack when paste is detected by calling /input undo
## () - signal handler
## $_[2] - buffer pointer
sub paste_undo_hack {
return weechat::WEECHAT_RC_OK if $IGNORE_INPUT_CHANGED;
return paste_undo_stop_ignore() if $IGNORE_INPUT_CHANGED2;
if ($MAGIC_LOCK > 0 && get_lock_enabled()) {
signall_ignore_input_changed(1);
$paste_undo_start_ignore_dynamic = 1;
Encode::_utf8_on(my $input = weechat::buffer_get_string($_[2], 'input'));
my $pos = weechat::buffer_get_integer($_[2], 'input_pos');
weechat::command($_[2], '/input undo') for 1..2;
weechat::buffer_set($_[2], 'input', $input);
weechat::buffer_set($_[2], 'input_pos', $pos);
$paste_undo_start_ignore_dynamic = 0;
signall_ignore_input_changed(0);
}
weechat::WEECHAT_RC_OK
}
## input_changed_eater -- suppress input_text_changed signal on new weechats
## () - signal handler
sub input_changed_eater {
$INPUT_CHANGED_EATER_FLAG = undef;
weechat::WEECHAT_RC_OK_EAT
}
## signall_ignore_input_changed -- use various methods to "ignore" input_text_changed signal
## $_[0] - start ignore or stop ignore
sub signall_ignore_input_changed {
if ($_[0]) {
weechat::hook_signal_send('input_flow_free', weechat::WEECHAT_HOOK_SIGNAL_INT, 1);
$input_changed_eater_dynamic = 1;
$IGNORE_INPUT_CHANGED = 1;
weechat::buffer_set('', 'completion_freeze', '1');
}
else {
weechat::buffer_set('', 'completion_freeze', '0');
$IGNORE_INPUT_CHANGED = undef;
$input_changed_eater_dynamic = 0;
weechat::hook_signal_send('input_flow_free', weechat::WEECHAT_HOOK_SIGNAL_INT, 0);
}
}
## multiline_complete_fix -- add per line /input handling for completion, movement and deletion
## () - command_run handler
## $_[0] - original bound data
## $_[1] - buffer pointer
## $_[2] - original command
sub multiline_complete_fix {
$magic_enter_cancel_dynamic = 0;
$multiline_complete_fix_dynamic = 0;
if ($_[2] =~ s/_message$/_line/ || !weechat::config_string_to_boolean(weechat::config_get_plugin('modify_keys'))) {
weechat::command($_[1], $_[2]);
}
else {
signall_ignore_input_changed(1);
Encode::_utf8_on(my $input = weechat::buffer_get_string($_[1], 'input'));
my $pos = weechat::buffer_get_integer($_[1], 'input_pos');
if ($pos && $_[2] =~ /(?:previous|beginning_of)_/ && (substr $input, $pos-1, 1) eq $NL) {
substr $input, $pos-1, 1, "\0"
}
elsif ($pos < length $input && $_[2] =~ /(?:next|end_of)_/ && (substr $input, $pos, 1) eq $NL) {
substr $input, $pos, 1, "\0"
}
my @lines = $pos ? (split /$NL/, (substr $input, 0, $pos), -1) : '';
my @after = $pos < length $input ? (split /$NL/, (substr $input, $pos), -1) : '';
$lines[-1] =~ s/\0$/$NL/;
$after[0] =~ s/^\0/$NL/;
my ($p1, $p2) = (pop @lines, shift @after);
weechat::buffer_set($_[1], 'input', $p1.$p2);
weechat::buffer_set($_[1], 'input_pos', length $p1);
$magic_enter_cancel_dynamic = 1;
$INPUT_CHANGED_EATER_FLAG = 1;
weechat::command($_[1], $_[2]);
my $changed_later = !$INPUT_CHANGED_EATER_FLAG;
magic_enter_cancel() if $changed_later;
$magic_enter_cancel_dynamic = 0;
Encode::_utf8_on(my $p = weechat::buffer_get_string($_[1], 'input'));
$pos = weechat::buffer_get_integer($_[1], 'input_pos');
weechat::command($_[1], '/input undo') if @lines || @after;
weechat::command($_[1], '/input undo');
weechat::buffer_set($_[1], 'input', join $NL, @lines, $p, @after);
weechat::buffer_set($_[1], 'input_pos', $pos+length join $NL, @lines, '');
signall_ignore_input_changed(0);
weechat::hook_signal_send('input_text_changed', weechat::WEECHAT_HOOK_SIGNAL_POINTER, $_[1]) if $changed_later;
}
$multiline_complete_fix_dynamic = 1;
$magic_enter_cancel_dynamic = 1;
weechat::WEECHAT_RC_OK_EAT
}
## help_cmd -- show multi-line script documentation
## () - command_run handler
sub help_cmd {
Nlib::read_manpage(SCRIPT_FILE, SCRIPT_NAME);
weechat::WEECHAT_RC_OK_EAT
}
## get_lock_time -- gets timeout for paste detection according to setting
## returns timeout (at least 1)
sub get_lock_time {
my $lock_time = weechat::config_get_plugin('paste_lock');
$lock_time = 1 unless $lock_time =~ /^\d+$/ && $lock_time;
$lock_time
}
## get_lock_enabled -- checks whether the paste detection lock is enabled
## returns bool
sub get_lock_enabled {
my $lock = weechat::config_get_plugin('paste_lock');
$lock = weechat::config_string_to_boolean($lock)
unless $lock =~ /^\d+$/;
$lock
}
## magic_lock_hatch -- set a timer for paste detection
## () - signal handler
sub magic_lock_hatch {
lock_timer_exp();
$MAGIC_LOCK_TIMER = weechat::hook_timer(get_lock_time(), 0, 1, 'lock_timer_exp', '');
weechat::WEECHAT_RC_OK
}
## magic_unlock -- reduce the lock added by paste detection
## () - timer handler
sub magic_unlock {
if ($MAGIC_LOCK_TIMER) {
weechat::hook_timer(get_lock_time(), 0, 1, 'magic_unlock', '');
}
else {
--$MAGIC_LOCK;
if (!$MAGIC_LOCK && $WEECHAT_PASTE_FIX_CTRLJ_CMD) {
do_key_bind('ctrl-J', $WEECHAT_PASTE_FIX_CTRLJ_CMD);
$WEECHAT_PASTE_FIX_CTRLJ_CMD = undef;
}
}
weechat::WEECHAT_RC_OK
}
## get_magic_enter_time -- get timeout for auto-sending messages according to config
## returns timeout
sub get_magic_enter_time {
my $magic_enter = weechat::config_get_plugin('magic_enter_time');
$magic_enter = 1000 * weechat::config_string_to_boolean($magic_enter)
unless $magic_enter =~ /^\d+$/;
$magic_enter
}
## magic_enter -- receive enter key and do magic things: set up a timer for sending the message, add newline
## () - command_run handler
## $_[1] - buffer pointer
sub magic_enter {
Encode::_utf8_on(my $input = weechat::buffer_get_string($_[1], 'input'));
if (!length $input && weechat::config_string_to_boolean(weechat::config_get_plugin('send_empty'))) {
weechat::command($_[1], '/input return');
}
else {
magic_enter_cancel();
weechat::command($_[1], INPUT_NL);
unless (get_lock_enabled() && $MAGIC_LOCK) {
if (weechat::config_string_to_boolean(weechat::config_get_plugin('magic_paste_only')) &&
$input !~ /$NL/) {
magic_enter_send($_[1]);
}
elsif (my $magic_enter = get_magic_enter_time()) {
$MAGIC_ENTER_TIMER = weechat::hook_timer($magic_enter, 0, 1, 'magic_enter_send', $_[1]);
}
}
}
weechat::WEECHAT_RC_OK_EAT
}
## magic_enter_send -- actually send enter key when triggered by magic_enter, remove preceding newline
## $_[0] - buffer pointer
## sending is delayed by 1ms to circumvent crash bug in api
sub magic_enter_send {
magic_enter_cancel();
weechat::command($_[0], '/input delete_previous_char');
weechat::command($_[0], '/wait 1ms /input return');
weechat::WEECHAT_RC_OK
}
## magic_enter_cancel -- cancel the timer for automatic sending of message, for example when more text was added, increase the paste lock for paste detection when used as signal handler
## () - signal handler when @_ is set
sub magic_enter_cancel {
if ($MAGIC_ENTER_TIMER) {
weechat::unhook($MAGIC_ENTER_TIMER);
$MAGIC_ENTER_TIMER = undef;
}
if ($MAGIC_LOCK_TIMER && @_) {
if (!$MAGIC_LOCK && !$WEECHAT_PASTE_FIX_CTRLJ_CMD &&
weechat::config_string_to_boolean(weechat::config_get_plugin('weechat_paste_fix'))) {
($WEECHAT_PASTE_FIX_CTRLJ_CMD) = get_key_command('ctrl-J');
$WEECHAT_PASTE_FIX_CTRLJ_CMD = '-' unless defined $WEECHAT_PASTE_FIX_CTRLJ_CMD;
do_key_bind('ctrl-J', '-');
}
if ($MAGIC_LOCK < 1) {
my $lock_time = get_lock_time();
++$MAGIC_LOCK;
weechat::hook_timer(get_lock_time(), 0, 1, 'magic_unlock', '');
}
}
weechat::WEECHAT_RC_OK
}
## need_magic_enter -- check if magic enter keybinding is needed according to config settings
## returns bool
sub need_magic_enter {
weechat::config_string_to_boolean(weechat::config_get_plugin('send_empty')) || get_magic_enter_time() ||
weechat::config_string_to_boolean(weechat::config_get_plugin('magic_paste_only'))
}
## do_key_bind -- mute execute a key binding, or unbind if $_[-1] is '-'
## @_ - arguments to /key bind
sub do_key_bind {
if ($_[-1] eq '-') {
pop;
weechat::command('', "/mute /key unbind @_");
}
elsif ($_[-1] eq '!') {
pop;
weechat::command('', "/mute /key reset @_");
}
else {
weechat::command('', "/mute /key bind @_");
}
}
{ my %keys;
## get_key_command -- get the command bound to a key
## $_[0] - key in weechat syntax
## returns the command
sub get_key_command {
unless (exists $keys{$_[0]}) {
($keys{$_[0]}) =
map { $_->{command} } grep { $_->{key} eq $_[0] }
Nlib::i2h('key')
}
$keys{$_[0]}
}
}
## default_options -- set up default option values on start and when unset
## () - config handler if @_ is set
sub default_options {
my %defaults = (
char => '↩',
tab => '──▶▏',
magic => '‼',
ipl => 'on',
lead_linebreak => 'on',
modify_keys => 'on',
send_empty => 'on',
magic_enter_time => '1000',
paste_lock => '1',
magic_paste_only => 'off',
hide_magic_nl => 'on',
weechat_paste_fix => 'on',
);
unless (weechat::config_is_set_plugin('ipl')) {
if (my $bar = weechat::bar_search('input')) {
weechat::bar_set($bar, $_, '0') for 'size', 'size_max';
}
}
for (keys %defaults) {
weechat::config_set_plugin($_, $defaults{$_})
unless weechat::config_is_set_plugin($_);
}
do_key_bind(KEY_RET, INPUT_NL)
if weechat::config_string_to_boolean(weechat::config_get_plugin('ipl'));
my ($enter_key) = get_key_command(KEY_RET);
if (need_magic_enter()) {
do_key_bind(KEY_RET, INPUT_MAGIC)
if $enter_key eq INPUT_NL;
}
else {
do_key_bind(KEY_RET, INPUT_NL)
if $enter_key eq INPUT_MAGIC;
}
weechat::WEECHAT_RC_OK
}
sub init_multiline {
$MAGIC_LOCK = -1;
default_options();
my $sf = SCRIPT_FILE;
for (Nlib::get_settings_from_pod($sf)) {
weechat::config_set_desc_plugin($_, Nlib::get_desc_from_pod($sf, $_));
}
weechat::WEECHAT_RC_OK
}
sub stop_multiline {
magic_enter_cancel();
if (need_magic_enter()) {
my ($enter_key) = get_key_command(KEY_RET);
do_key_bind(KEY_RET, INPUT_NL)
if $enter_key eq INPUT_MAGIC;
}
if ($WEECHAT_PASTE_FIX_CTRLJ_CMD) {
do_key_bind('ctrl-J', $WEECHAT_PASTE_FIX_CTRLJ_CMD);
$WEECHAT_PASTE_FIX_CTRLJ_CMD = undef;
}
if (weechat::config_string_to_boolean(weechat::config_get_plugin('ipl'))) {
do_key_bind(KEY_RET, '!');
}
weechat::WEECHAT_RC_OK
}

+ 79
- 0
config/weechat/plugins.conf View File

@ -0,0 +1,79 @@
#
# weechat -- plugins.conf
#
# WARNING: It is NOT recommended to edit this file by hand,
# especially if WeeChat is running.
#
# Use /set or similar command to change settings in WeeChat.
#
# For more info, see: https://weechat.org/doc/quickstart
#
[var]
perl.atcomplete.enabled = "on"
perl.highmon.alignment = "channel"
perl.highmon.away_only = "off"
perl.highmon.color_buf = "on"
perl.highmon.first_run = "true"
perl.highmon.hotlist_show = "off"
perl.highmon.logging = "off"
perl.highmon.merge_private = "off"
perl.highmon.nick_prefix = "<"
perl.highmon.nick_suffix = ">"
perl.highmon.output = "buffer"
perl.highmon.short_names = "off"
perl.multiline.char = "↩"
perl.multiline.hide_magic_nl = "on"
perl.multiline.ipl = "on"
perl.multiline.lead_linebreak = "on"
perl.multiline.magic = "‼"
perl.multiline.magic_enter_time = "1000"
perl.multiline.magic_paste_only = "off"
perl.multiline.modify_keys = "on"
perl.multiline.paste_lock = "1"
perl.multiline.send_empty = "on"
perl.multiline.tab = "──▶▏"
perl.multiline.weechat_paste_fix = "on"
python.chanotify.filters = "*:*"
python.chanotify.status = "on"
python.go.auto_jump = "off"
python.go.buffer_number = "on"
python.go.color_name = "black,cyan"
python.go.color_name_highlight = "red,cyan"
python.go.color_name_highlight_selected = "red,brown"
python.go.color_name_selected = "black,brown"
python.go.color_number = "yellow,magenta"
python.go.color_number_selected = "yellow,red"
python.go.fuzzy_search = "off"
python.go.message = "Go to: "
python.go.short_name = "off"
python.go.sort = "number,beginning"
python.go.use_core_instead_weechat = "off"
[desc]
perl.atcomplete.enabled = "enable completion of nicks starting with @ (default: "on")"
perl.multiline.char = "character(s) which should be displayed to indicate end of line"
perl.multiline.hide_magic_nl = "whether the new line inserted by magic enter key will be hidden"
perl.multiline.ipl = "this setting controls override of ctrl-M (enter key) by script. Turn it off if you don't want multiline.pl to set and re-set the key binding."
perl.multiline.lead_linebreak = "if turned on, multi-line messages always start on a new line"
perl.multiline.magic = "indicator displayed when message will be sent soon"
perl.multiline.magic_enter_time = "delay after pressing enter before sending automatically (in ms), or 0 to disable"
perl.multiline.magic_paste_only = "only use multi-line messages for multi-line pastes (multi-line on enter is disabled by this)"
perl.multiline.modify_keys = "if turned on, cursor keys are modified so that they respect line boundaries instead of treating the whole multi-line message as a single line"
perl.multiline.paste_lock = "time-out to detect pastes (disable the weechat built-in paste detection if you want to use this)"
perl.multiline.send_empty = "set to on to automatically disregard enter key on empty line"
perl.multiline.tab = "character(s) which should be displayed instead of Tab key character"
perl.multiline.weechat_paste_fix = "disable ctrl-J binding when paste is detected to stop silly weechat sending out pastes without allowing to edit them"
python.go.auto_jump = "automatically jump to buffer when it is uniquely selected (default: "off")"
python.go.buffer_number = "display buffer number (default: "on")"
python.go.color_name = "color for buffer name (not selected) (default: "black,cyan")"
python.go.color_name_highlight = "color for highlight in buffer name (not selected) (default: "red,cyan")"
python.go.color_name_highlight_selected = "color for highlight in a selected buffer name (default: "red,brown")"
python.go.color_name_selected = "color for a selected buffer name (default: "black,brown")"
python.go.color_number = "color for buffer number (not selected) (default: "yellow,magenta")"
python.go.color_number_selected = "color for selected buffer number (default: "yellow,red")"
python.go.fuzzy_search = "search buffer matches using approximation (default: "off")"
python.go.message = "message to display before list of buffers (default: "Go to: ")"
python.go.short_name = "display and search in short names instead of buffer name (default: "off")"
python.go.sort = "comma-separated list of keys to sort buffers (the order is important, sorts are performed in the given order): name = sort by name (or short name), (default: "number,beginning")"
python.go.use_core_instead_weechat = "use name "core" instead of "weechat" for core buffer (default: "off")"

+ 14
- 0
config/weechat/python.conf View File

@ -0,0 +1,14 @@
#
# weechat -- python.conf
#
# WARNING: It is NOT recommended to edit this file by hand,
# especially if WeeChat is running.
#
# Use /set or similar command to change settings in WeeChat.
#
# For more info, see: https://weechat.org/doc/quickstart
#
[look]
check_license = off
eval_keep_context = on

+ 70
- 0
config/weechat/python/aesthetic.py View File

@ -0,0 +1,70 @@
# -*- coding: utf-8 -*-
#
# Script Name: aesthetic.py
# Script Author: Wojciech Siewierski
# Script License: GPL3
# Contact: vifon @ irc.freenode.net
SCRIPT_NAME = 'aesthetic'
SCRIPT_AUTHOR = 'Wojciech Siewierski'
SCRIPT_VERSION = '1.0.6'
SCRIPT_LICENSE = 'GPL3'
SCRIPT_DESC = 'Make messages more A E S T H E T I C A L L Y pleasing.'
import_ok = True
try:
import weechat
except ImportError:
print('This script must be run under WeeChat')
print('You can obtain a copy of WeeChat, for free, at https://weechat.org')
import_ok = False
weechat_version = 0
import shlex
import sys
def aesthetic_(args):
for arg in args:
try:
arg = arg.decode('utf8')
except AttributeError:
pass
yield " ".join(arg.upper())
for n, char in enumerate(arg[1:]):
yield " ".join(" "*(n+1)).join(char.upper()*2)
def aesthetic(args):
if sys.version_info < (3,):
return (x.encode('utf8') for x in aesthetic_(args))
else:
return aesthetic_(args)
def aesthetic_cb(data, buffer, args):
for x in aesthetic(shlex.split(args)):
weechat.command(buffer, x)
return weechat.WEECHAT_RC_OK
if __name__ == "__main__" and import_ok:
if weechat.register(SCRIPT_NAME, SCRIPT_AUTHOR, SCRIPT_VERSION, SCRIPT_LICENSE, SCRIPT_DESC, "", ""):
weechat_version = weechat.info_get("version_number", "") or 0
weechat.hook_command(
"aesthetic",
"""Format a message like this:
E X A M P L E
X X
A A
M M
P P
L L
E E
Each argument is formatted separately, use sh-like quotes for grouping. For example '/aesthetic foo bar' will send two such blocks while '/aesthetic "foo bar"' would send one larger one.
Use with care to not cause undesirable message spam.""",
"message", "",
"",
"aesthetic_cb", ""
)

+ 472
- 0
config/weechat/python/anotify.py View File

@ -0,0 +1,472 @@
# -*- coding: utf-8 -*-
#
# anotify.py
# Copyright (c) 2012 magnific0 <jacco.geul@gmail.com>
#
# based on:
# growl.py
# Copyright (c) 2011 Sorin Ionescu <sorin.ionescu@gmail.com>
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
SCRIPT_NAME = 'anotify'
SCRIPT_AUTHOR = 'magnific0'
SCRIPT_VERSION = '1.0.2'
SCRIPT_LICENSE = 'MIT'
SCRIPT_DESC = 'Sends libnotify notifications upon events.'
# Changelog
# 2014-05-10: v1.0.1 Change hook_print callback argument type of
# displayed/highlight (WeeChat >= 1.0)
# 2012-09-20: v1.0.0 Forked from original and adapted for libnotify.
# -----------------------------------------------------------------------------
# Settings
# -----------------------------------------------------------------------------
SETTINGS = {
'show_public_message': 'off',
'show_private_message': 'on',
'show_public_action_message': 'off',
'show_private_action_message': 'on',
'show_notice_message': 'off',
'show_invite_message': 'on',
'show_highlighted_message': 'on',
'show_server': 'on',
'show_channel_topic': 'on',
'show_dcc': 'on',
'show_upgrade_ended': 'on',
'sticky': 'off',
'sticky_away': 'on',
'icon': '/usr/share/pixmaps/weechat.xpm',
}
# -----------------------------------------------------------------------------
# Imports
# -----------------------------------------------------------------------------
try:
import re
import os
import weechat
import notify2
IMPORT_OK = True
except ImportError as error:
IMPORT_OK = False
if str(error).find('weechat') != -1:
print('This script must be run under WeeChat.')
print('Get WeeChat at http://www.weechat.org.')
else:
weechat.prnt('', 'anotify: {0}'.format(error))
# -----------------------------------------------------------------------------
# Globals
# -----------------------------------------------------------------------------
TAGGED_MESSAGES = {
'public message or action': set(['irc_privmsg', 'notify_message']),
'private message or action': set(['irc_privmsg', 'notify_private']),
'notice message': set(['irc_notice', 'notify_private']),
'invite message': set(['irc_invite', 'notify_highlight']),
'channel topic': set(['irc_topic', ]),
#'away status': set(['away_info', ]),
}
UNTAGGED_MESSAGES = {
'away status':
re.compile(r'^You ((\w+).){2,3}marked as being away', re.UNICODE),
'dcc chat request':
re.compile(r'^xfer: incoming chat request from (\w+)', re.UNICODE),
'dcc chat closed':
re.compile(r'^xfer: chat closed with (\w+)', re.UNICODE),
'dcc get request':
re.compile(
r'^xfer: incoming file from (\w+) [^:]+: ((?:,\w|[^,])+),',
re.UNICODE),
'dcc get completed':
re.compile(r'^xfer: file ([^\s]+) received from \w+: OK', re.UNICODE),
'dcc get failed':
re.compile(
r'^xfer: file ([^\s]+) received from \w+: FAILED',
re.UNICODE),
'dcc send completed':
re.compile(r'^xfer: file ([^\s]+) sent to \w+: OK', re.UNICODE),
'dcc send failed':
re.compile(r'^xfer: file ([^\s]+) sent to \w+: FAILED', re.UNICODE),
}
DISPATCH_TABLE = {
'away status': 'set_away_status',
'public message or action': 'notify_public_message_or_action',
'private message or action': 'notify_private_message_or_action',
'notice message': 'notify_notice_message',
'invite message': 'notify_invite_message',
'channel topic': 'notify_channel_topic',
'dcc chat request': 'notify_dcc_chat_request',
'dcc chat closed': 'notify_dcc_chat_closed',
'dcc get request': 'notify_dcc_get_request',
'dcc get completed': 'notify_dcc_get_completed',
'dcc get failed': 'notify_dcc_get_failed',
'dcc send completed': 'notify_dcc_send_completed',
'dcc send failed': 'notify_dcc_send_failed',
}
STATE = {
'icon': None,
'is_away': False
}
# -----------------------------------------------------------------------------
# Notifiers
# -----------------------------------------------------------------------------
def cb_irc_server_connected(data, signal, signal_data):
'''Notify when connected to IRC server.'''
if weechat.config_get_plugin('show_server') == 'on':
a_notify(
'Server',
'Server Connected',
'Connected to network {0}.'.format(signal_data))
return weechat.WEECHAT_RC_OK
def cb_irc_server_disconnected(data, signal, signal_data):
'''Notify when disconnected to IRC server.'''
if weechat.config_get_plugin('show_server') == 'on':
a_notify(
'Server',
'Server Disconnected',
'Disconnected from network {0}.'.format(signal_data))
return weechat.WEECHAT_RC_OK
def cb_notify_upgrade_ended(data, signal, signal_data):
'''Notify on end of WeeChat upgrade.'''
if weechat.config_get_plugin('show_upgrade_ended') == 'on':
a_notify(
'WeeChat',
'WeeChat Upgraded',
'WeeChat has been upgraded.')
return weechat.WEECHAT_RC_OK
def notify_highlighted_message(prefix, message):
'''Notify on highlighted message.'''
if weechat.config_get_plugin("show_highlighted_message") == "on":
a_notify(
'Highlight',
'Highlighted Message',
"{0}: {1}".format(prefix, message),
priority=notify2.URGENCY_CRITICAL)
def notify_public_message_or_action(prefix, message, highlighted):
'''Notify on public message or action.'''
if prefix == ' *':
regex = re.compile(r'^(\w+) (.+)$', re.UNICODE)
match = regex.match(message)
if match:
prefix = match.group(1)
message = match.group(2)
notify_public_action_message(prefix, message, highlighted)
else:
if highlighted:
notify_highlighted_message(prefix, message)
elif weechat.config_get_plugin("show_public_message") == "on":
a_notify(
'Public',
'Public Message',
'{0}: {1}'.format(prefix, message))
def notify_private_message_or_action(prefix, message, highlighted):
'''Notify on private message or action.'''
regex = re.compile(r'^CTCP_MESSAGE.+?ACTION (.+)$', re.UNICODE)
match = regex.match(message)
if match:
notify_private_action_message(prefix, match.group(1), highlighted)
else:
if prefix == ' *':
regex = re.compile(r'^(\w+) (.+)$', re.UNICODE)
match = regex.match(message)
if match:
prefix = match.group(1)
message = match.group(2)
notify_private_action_message(prefix, message, highlighted)
else:
if highlighted:
notify_highlighted_message(prefix, message)
elif weechat.config_get_plugin("show_private_message") == "on":
a_notify(
'Private',
'Private Message',
'{0}: {1}'.format(prefix, message))
def notify_public_action_message(prefix, message, highlighted):
'''Notify on public action message.'''
if highlighted:
notify_highlighted_message(prefix, message)
elif weechat.config_get_plugin("show_public_action_message") == "on":
a_notify(
'Action',
'Public Action Message',
'{0}: {1}'.format(prefix, message),
priority=notify2.URGENCY_NORMAL)
def notify_private_action_message(prefix, message, highlighted):
'''Notify on private action message.'''
if highlighted:
notify_highlighted_message(prefix, message)
elif weechat.config_get_plugin("show_private_action_message") == "on":
a_notify(
'Action',
'Private Action Message',
'{0}: {1}'.format(prefix, message),
priority=notify2.URGENCY_NORMAL)
def notify_notice_message(prefix, message, highlighted):
'''Notify on notice message.'''
regex = re.compile(r'^([^\s]*) [^:]*: (.+)$', re.UNICODE)
match = regex.match(message)
if match:
prefix = match.group(1)
message = match.group(2)
if highlighted:
notify_highlighted_message(prefix, message)
elif weechat.config_get_plugin("show_notice_message") == "on":
a_notify(
'Notice',
'Notice Message',
'{0}: {1}'.format(prefix, message))
def notify_invite_message(prefix, message, highlighted):
'''Notify on channel invitation message.'''
if weechat.config_get_plugin("show_invite_message") == "on":
regex = re.compile(
r'^You have been invited to ([^\s]+) by ([^\s]+)$', re.UNICODE)
match = regex.match(message)
if match:
channel = match.group(1)
nick = match.group(2)
a_notify(
'Invite',
'Channel Invitation',
'{0} has invited you to join {1}.'.format(nick, channel))
def notify_channel_topic(prefix, message, highlighted):
'''Notify on channel topic change.'''
if weechat.config_get_plugin("show_channel_topic") == "on":
regex = re.compile(
r'^\w+ has (?:changed|unset) topic for ([^\s]+)' +
'(?:(?: from "(?:(?:"\w|[^"])+)")? to "((?:"\w|[^"])+)")?',
re.UNICODE)
match = regex.match(message)
if match:
channel = match.group(1)
topic = match.group(2) or ''
a_notify(
'Channel',
'Channel Topic',
"{0}: {1}".format(channel, topic))
def notify_dcc_chat_request(match):
'''Notify on DCC chat request.'''
if weechat.config_get_plugin("show_dcc") == "on":
nick = match.group(1)
a_notify(
'DCC',
'Direct Chat Request',
'{0} wants to chat directly.'.format(nick))
def notify_dcc_chat_closed(match):
'''Notify on DCC chat termination.'''
if weechat.config_get_plugin("show_dcc") == "on":
nick = match.group(1)
a_notify(
'DCC',
'Direct Chat Ended',
'Direct chat with {0} has ended.'.format(nick))
def notify_dcc_get_request(match):
'Notify on DCC get request.'
if weechat.config_get_plugin("show_dcc") == "on":
nick = match.group(1)
file_name = match.group(2)
a_notify(
'DCC',
'File Transfer Request',
'{0} wants to send you {1}.'.format(nick, file_name))
def notify_dcc_get_completed(match):
'Notify on DCC get completion.'
if weechat.config_get_plugin("show_dcc") == "on":
file_name = match.group(1)
a_notify('DCC', 'Download Complete', file_name)
def notify_dcc_get_failed(match):
'Notify on DCC get failure.'
if weechat.config_get_plugin("show_dcc") == "on":
file_name = match.group(1)
a_notify('DCC', 'Download Failed', file_name)
def notify_dcc_send_completed(match):
'Notify on DCC send completion.'
if weechat.config_get_plugin("show_dcc") == "on":
file_name = match.group(1)
a_notify('DCC', 'Upload Complete', file_name)
def notify_dcc_send_failed(match):
'Notify on DCC send failure.'
if weechat.config_get_plugin("show_dcc") == "on":
file_name = match.group(1)
a_notify('DCC', 'Upload Failed', file_name)
# -----------------------------------------------------------------------------
# Utility
# -----------------------------------------------------------------------------
def set_away_status(match):
status = match.group(1)
if status == 'been ':
STATE['is_away'] = True
if status == 'longer ':
STATE['is_away'] = False
def cb_process_message(
data,
wbuffer,
date,
tags,
displayed,
highlight,
prefix,
message
):
'''Delegates incoming messages to appropriate handlers.'''
tags = set(tags.split(','))
functions = globals()
is_public_message = tags.issuperset(
TAGGED_MESSAGES['public message or action'])
buffer_name = weechat.buffer_get_string(wbuffer, 'name')
dcc_buffer_regex = re.compile(r'^irc_dcc\.', re.UNICODE)
dcc_buffer_match = dcc_buffer_regex.match(buffer_name)
highlighted = False
if int(highlight):
highlighted = True
# Private DCC message identifies itself as public.
if is_public_message and dcc_buffer_match:
notify_private_message_or_action(prefix, message, highlighted)
return weechat.WEECHAT_RC_OK
# Pass identified, untagged message to its designated function.
for key, value in UNTAGGED_MESSAGES.items():
match = value.match(message)
if match:
functions[DISPATCH_TABLE[key]](match)
return weechat.WEECHAT_RC_OK
# Pass identified, tagged message to its designated function.
for key, value in TAGGED_MESSAGES.items():
if tags.issuperset(value):
functions[DISPATCH_TABLE[key]](prefix, message, highlighted)
return weechat.WEECHAT_RC_OK
return weechat.WEECHAT_RC_OK
def a_notify(notification, title, description, priority=notify2.URGENCY_LOW):
'''Returns whether notifications should be sticky.'''
is_away = STATE['is_away']
icon = STATE['icon']
time_out = 5000
if weechat.config_get_plugin('sticky') == 'on':
time_out = 0
if weechat.config_get_plugin('sticky_away') == 'on' and is_away:
time_out = 0
try:
notify2.init("wee-notifier")
wn = notify2.Notification(title, description, icon)
wn.set_urgency(priority)
wn.set_timeout(time_out)
wn.show()
except Exception as error:
weechat.prnt('', 'anotify: {0}'.format(error))
# -----------------------------------------------------------------------------
# Main
# -----------------------------------------------------------------------------
def main():
'''Sets up WeeChat notifications.'''
# Initialize options.
for option, value in SETTINGS.items():
if not weechat.config_is_set_plugin(option):
weechat.config_set_plugin(option, value)
# Initialize.
name = "WeeChat"
icon = "/usr/share/pixmaps/weechat.xpm"
notifications = [
'Public',
'Private',
'Action',
'Notice',
'Invite',
'Highlight',
'Server',
'Channel',
'DCC',
'WeeChat'
]
STATE['icon'] = icon
# Register hooks.
weechat.hook_signal(
'irc_server_connected',
'cb_irc_server_connected',
'')
weechat.hook_signal(
'irc_server_disconnected',
'cb_irc_server_disconnected',
'')
weechat.hook_signal('upgrade_ended', 'cb_upgrade_ended', '')
weechat.hook_print('', '', '', 1, 'cb_process_message', '')
if __name__ == '__main__' and IMPORT_OK and weechat.register(
SCRIPT_NAME,
SCRIPT_AUTHOR,
SCRIPT_VERSION,
SCRIPT_LICENSE,
SCRIPT_DESC,
'',
''
):
main()

+ 1
- 0
config/weechat/python/autoload/aesthetic.py View File

@ -0,0 +1 @@
../aesthetic.py

+ 1
- 0
config/weechat/python/autoload/anotify.py View File

@ -0,0 +1 @@
../anotify.py

+ 1
- 0
config/weechat/python/autoload/autosort.py View File

@ -0,0 +1 @@
../autosort.py

+ 1
- 0
config/weechat/python/autoload/colorize_nicks.py View File

@ -0,0 +1 @@
../colorize_nicks.py

+ 1
- 0
config/weechat/python/autoload/go.py View File

@ -0,0 +1 @@
../go.py

+ 1075
- 0
config/weechat/python/autosort.py
File diff suppressed because it is too large
View File


+ 409
- 0
config/weechat/python/colorize_nicks.py View File

@ -0,0 +1,409 @@
# -*- coding: utf-8 -*-
#
# Copyright (c) 2010 by xt <xt@bash.no>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# This script colors nicks in IRC channels in the actual message
# not just in the prefix section.
#
#
# History:
# 2020-11-29: jess
# version 28: fix ignore_tags having been broken by weechat 2.9 changes
# 2020-05-09: Sébastien Helleu <flashcode@flashtux.org>
# version 27: add compatibility with new weechat_print modifier data
# (WeeChat >= 2.9)
# 2018-04-06: Joey Pabalinas <joeypabalinas@gmail.com>
# version 26: fix freezes with too many nicks in one line
# 2018-03-18: nils_2
# version 25: fix unable to run function colorize_config_reload_cb()
# 2017-06-20: lbeziaud <louis.beziaud@ens-rennes.fr>
# version 24: colorize utf8 nicks
# 2017-03-01, arza <arza@arza.us>
# version 23: don't colorize nicklist group names
# 2016-05-01, Simmo Saan <simmo.saan@gmail.com>
# version 22: invalidate cached colors on hash algorithm change
# 2015-07-28, xt
# version 21: fix problems with nicks with commas in them
# 2015-04-19, xt
# version 20: fix ignore of nicks in URLs
# 2015-04-18, xt
# version 19: new option ignore nicks in URLs
# 2015-03-03, xt
# version 18: iterate buffers looking for nicklists instead of servers
# 2015-02-23, holomorph
# version 17: fix coloring in non-channel buffers (#58)
# 2014-09-17, holomorph
# version 16: use weechat config facilities
# clean unused, minor linting, some simplification
# 2014-05-05, holomorph
# version 15: fix python2-specific re.search check
# 2013-01-29, nils_2
# version 14: make script compatible with Python 3.x
# 2012-10-19, ldvx
# version 13: Iterate over every word to prevent incorrect colorization of
# nicks. Added option greedy_matching.
# 2012-04-28, ldvx
# version 12: added ignore_tags to avoid colorizing nicks if tags are present
# 2012-01-14, nesthib
# version 11: input_text_display hook and modifier to colorize nicks in input bar
# 2010-12-22, xt
# version 10: hook config option for updating blacklist
# 2010-12-20, xt
# version 0.9: hook new config option for weechat 0.3.4
# 2010-11-01, nils_2
# version 0.8: hook_modifier() added to communicate with rainbow_text
# 2010-10-01, xt
# version 0.7: changes to support non-irc-plugins
# 2010-07-29, xt
# version 0.6: compile regexp as per patch from Chris quigybo@hotmail.com
# 2010-07-19, xt
# version 0.5: fix bug with incorrect coloring of own nick
# 2010-06-02, xt
# version 0.4: update to reflect API changes
# 2010-03-26, xt
# version 0.3: fix error with exception
# 2010-03-24, xt
# version 0.2: use ignore_channels when populating to increase performance.
# 2010-02-03, xt
# version 0.1: initial (based on ruby script by dominikh)
#
# Known issues: nicks will not get colorized if they begin with a character
# such as ~ (which some irc networks do happen to accept)
import weechat
import re
w = weechat
SCRIPT_NAME = "colorize_nicks"
SCRIPT_AUTHOR = "xt <xt@bash.no>"
SCRIPT_VERSION = "28"
SCRIPT_LICENSE = "GPL"
SCRIPT_DESC = "Use the weechat nick colors in the chat area"
# Based on the recommendations in RFC 7613. A valid nick is composed
# of anything but " ,*?.!@".
VALID_NICK = r'([@~&!%+-])?([^\s,\*?\.!@]+)'
valid_nick_re = re.compile(VALID_NICK)
ignore_channels = []
ignore_nicks = []
# Dict with every nick on every channel with its color as lookup value
colored_nicks = {}
CONFIG_FILE_NAME = "colorize_nicks"
# config file and options
colorize_config_file = ""
colorize_config_option = {}
def colorize_config_init():
'''
Initialization of configuration file.
Sections: look.
'''
global colorize_config_file, colorize_config_option
colorize_config_file = weechat.config_new(CONFIG_FILE_NAME,
"", "")
if colorize_config_file == "":
return
# section "look"
section_look = weechat.config_new_section(
colorize_config_file, "look", 0, 0, "", "", "", "", "", "", "", "", "", "")
if section_look == "":
weechat.config_free(colorize_config_file)
return
colorize_config_option["blacklist_channels"] = weechat.config_new_option(
colorize_config_file, section_look, "blacklist_channels",
"string", "Comma separated list of channels", "", 0, 0,
"", "", 0, "", "", "", "", "", "")
colorize_config_option["blacklist_nicks"] = weechat.config_new_option(
colorize_config_file, section_look, "blacklist_nicks",
"string", "Comma separated list of nicks", "", 0, 0,
"so,root", "so,root", 0, "", "", "", "", "", "")
colorize_config_option["min_nick_length"] = weechat.config_new_option(
colorize_config_file, section_look, "min_nick_length",
"integer", "Minimum length nick to colorize", "",
2, 20, "", "", 0, "", "", "", "", "", "")
colorize_config_option["colorize_input"] = weechat.config_new_option(
colorize_config_file, section_look, "colorize_input",
"boolean", "Whether to colorize input", "", 0,
0, "off", "off", 0, "", "", "", "", "", "")
colorize_config_option["ignore_tags"] = weechat.config_new_option(
colorize_config_file, section_look, "ignore_tags",
"string", "Comma separated list of tags to ignore; i.e. irc_join,irc_part,irc_quit", "", 0, 0,
"", "", 0, "", "", "", "", "", "")
colorize_config_option["greedy_matching"] = weechat.config_new_option(
colorize_config_file, section_look, "greedy_matching",
"boolean", "If off, then use lazy matching instead", "", 0,
0, "on", "on", 0, "", "", "", "", "", "")
colorize_config_option["match_limit"] = weechat.config_new_option(
colorize_config_file, section_look, "match_limit",
"integer", "Fall back to lazy matching if greedy matches exceeds this number", "",
20, 1000, "", "", 0, "", "", "", "", "", "")
colorize_config_option["ignore_nicks_in_urls"] = weechat.config_new_option(
colorize_config_file, section_look, "ignore_nicks_in_urls",
"boolean", "If on, don't colorize nicks inside URLs", "", 0,
0, "off", "off", 0, "", "", "", "", "", "")
def colorize_config_read():
''' Read configuration file. '''
global colorize_config_file
return weechat.config_read(colorize_config_file)
def colorize_nick_color(nick, my_nick):
''' Retrieve nick color from weechat. '''
if nick == my_nick:
return w.color(w.config_string(w.config_get('weechat.color.chat_nick_self')))
else:
return w.info_get('irc_nick_color', nick)
def colorize_cb(data, modifier, modifier_data, line):
''' Callback that does the colorizing, and returns new line if changed '''
global ignore_nicks, ignore_channels, colored_nicks
if modifier_data.startswith('0x'):
# WeeChat >= 2.9
buffer, tags = modifier_data.split(';', 1)
else:
# WeeChat <= 2.8
plugin, buffer_name, tags = modifier_data.split(';', 2)
buffer = w.buffer_search(plugin, buffer_name)
channel = w.buffer_get_string(buffer, 'localvar_channel')
tags = tags.split(',')
# Check if buffer has colorized nicks
if buffer not in colored_nicks:
return line
if channel and channel in ignore_channels:
return line
min_length = w.config_integer(colorize_config_option['min_nick_length'])
reset = w.color('reset')
# Don't colorize if the ignored tag is present in message
tag_ignores = w.config_string(colorize_config_option['ignore_tags']).split(',')
for tag in tags:
if tag in tag_ignores:
return line
for words in valid_nick_re.findall(line):
nick = words[1]
# Check that nick is not ignored and longer than minimum length
if len(nick) < min_length or nick in ignore_nicks:
continue
# If the matched word is not a known nick, we try to match the
# word without its first or last character (if not a letter).
# This is necessary as "foo:" is a valid nick, which could be
# adressed as "foo::".
if nick not in colored_nicks[buffer]:
if not nick[-1].isalpha() and not nick[0].isalpha():
if nick[1:-1] in colored_nicks[buffer]:
nick = nick[1:-1]
elif not nick[0].isalpha():
if nick[1:] in colored_nicks[buffer]:
nick = nick[1:]
elif not nick[-1].isalpha():
if nick[:-1] in colored_nicks[buffer]:
nick = nick[:-1]
# Check that nick is in the dictionary colored_nicks
if nick in colored_nicks[buffer]:
nick_color = colored_nicks[buffer][nick]
try:
# Let's use greedy matching. Will check against every word in a line.
if w.config_boolean(colorize_config_option['greedy_matching']):
cnt = 0
limit = w.config_integer(colorize_config_option['match_limit'])
for word in line.split():
cnt += 1
assert cnt < limit
# if cnt > limit:
# raise RuntimeError('Exceeded colorize_nicks.look.match_limit.');
if w.config_boolean(colorize_config_option['ignore_nicks_in_urls']) and \
word.startswith(('http://', 'https://')):
continue
if nick in word:
# Is there a nick that contains nick and has a greater lenght?
# If so let's save that nick into var biggest_nick
biggest_nick = ""
for i in colored_nicks[buffer]:
cnt += 1
assert cnt < limit
if nick in i and nick != i and len(i) > len(nick):
if i in word:
# If a nick with greater len is found, and that word
# also happens to be in word, then let's save this nick
biggest_nick = i
# If there's a nick with greater len, then let's skip this
# As we will have the chance to colorize when biggest_nick
# iterates being nick.
if len(biggest_nick) > 0 and biggest_nick in word:
pass
elif len(word) < len(biggest_nick) or len(biggest_nick) == 0:
new_word = word.replace(nick, '%s%s%s' % (nick_color, nick, reset))
line = line.replace(word, new_word)
# Switch to lazy matching
else:
raise AssertionError
except AssertionError:
# Let's use lazy matching for nick
nick_color = colored_nicks[buffer][nick]
# The two .? are in case somebody writes "nick:", "nick,", etc
# to address somebody
regex = r"(\A|\s).?(%s).?(\Z|\s)" % re.escape(nick)
match = re.search(regex, line)
if match is not None:
new_line = line[:match.start(2)] + nick_color+nick+reset + line[match.end(2):]
line = new_line
return line
def colorize_input_cb(data, modifier, modifier_data, line):
''' Callback that does the colorizing in input '''
global ignore_nicks, ignore_channels, colored_nicks
min_length = w.config_integer(colorize_config_option['min_nick_length'])
if not w.config_boolean(colorize_config_option['colorize_input']):
return line
buffer = w.current_buffer()
# Check if buffer has colorized nicks
if buffer not in colored_nicks:
return line
channel = w.buffer_get_string(buffer, 'name')
if channel and channel in ignore_channels:
return line
reset = w.color('reset')
for words in valid_nick_re.findall(line):
nick = words[1]
# Check that nick is not ignored and longer than minimum length
if len(nick) < min_length or nick in ignore_nicks:
continue
if nick in colored_nicks[buffer]:
nick_color = colored_nicks[buffer][nick]
line = line.replace(nick, '%s%s%s' % (nick_color, nick, reset))
return line
def populate_nicks(*args):
''' Fills entire dict with all nicks weechat can see and what color it has
assigned to it. '''
global colored_nicks
colored_nicks = {}
buffers = w.infolist_get('buffer', '', '')
while w.infolist_next(buffers):
buffer_ptr = w.infolist_pointer(buffers, 'pointer')
my_nick = w.buffer_get_string(buffer_ptr, 'localvar_nick')
nicklist = w.infolist_get('nicklist', buffer_ptr, '')
while w.infolist_next(nicklist):
if buffer_ptr not in colored_nicks:
colored_nicks[buffer_ptr] = {}
if w.infolist_string(nicklist, 'type') != 'nick':
continue
nick = w.infolist_string(nicklist, 'name')
nick_color = colorize_nick_color(nick, my_nick)
colored_nicks[buffer_ptr][nick] = nick_color
w.infolist_free(nicklist)
w.infolist_free(buffers)
return w.WEECHAT_RC_OK
def add_nick(data, signal, type_data):
''' Add nick to dict of colored nicks '''
global colored_nicks
# Nicks can have , in them in some protocols
splitted = type_data.split(',')
pointer = splitted[0]
nick = ",".join(splitted[1:])
if pointer not in colored_nicks:
colored_nicks[pointer] = {}
my_nick = w.buffer_get_string(pointer, 'localvar_nick')
nick_color = colorize_nick_color(nick, my_nick)
colored_nicks[pointer][nick] = nick_color
return w.WEECHAT_RC_OK
def remove_nick(data, signal, type_data):
''' Remove nick from dict with colored nicks '''
global colored_nicks
# Nicks can have , in them in some protocols
splitted = type_data.split(',')
pointer = splitted[0]
nick = ",".join(splitted[1:])
if pointer in colored_nicks and nick in colored_nicks[pointer]:
del colored_nicks[pointer][nick]
return w.WEECHAT_RC_OK
def update_blacklist(*args):
''' Set the blacklist for channels and nicks. '''
global ignore_channels, ignore_nicks
ignore_channels = w.config_string(colorize_config_option['blacklist_channels']).split(',')
ignore_nicks = w.config_string(colorize_config_option['blacklist_nicks']).split(',')
return w.WEECHAT_RC_OK
if __name__ == "__main__":
if w.register(SCRIPT_NAME, SCRIPT_AUTHOR, SCRIPT_VERSION, SCRIPT_LICENSE,
SCRIPT_DESC, "", ""):
colorize_config_init()
colorize_config_read()
# Run once to get data ready
update_blacklist()
populate_nicks()
w.hook_signal('nicklist_nick_added', 'add_nick', '')
w.hook_signal('nicklist_nick_removed', 'remove_nick', '')
w.hook_modifier('weechat_print', 'colorize_cb', '')
# Hook config for changing colors
w.hook_config('weechat.color.chat_nick_colors', 'populate_nicks', '')
w.hook_config('weechat.look.nick_color_hash', 'populate_nicks', '')
# Hook for working togheter with other scripts (like colorize_lines)
w.hook_modifier('colorize_nicks', 'colorize_cb', '')
# Hook for modifying input
w.hook_modifier('250|input_text_display', 'colorize_input_cb', '')
# Hook for updating blacklist (this could be improved to use fnmatch)
weechat.hook_config('%s.look.blacklist*' % SCRIPT_NAME, 'update_blacklist', '')

+ 563
- 0
config/weechat/python/go.py View File

@ -0,0 +1,563 @@
# -*- coding: utf-8 -*-
#
# Copyright (C) 2009-2014 Sébastien Helleu <flashcode@flashtux.org>
# Copyright (C) 2010 m4v <lambdae2@gmail.com>
# Copyright (C) 2011 stfn <stfnmd@googlemail.com>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
#
# History:
#
# 2019-07-11, Simmo Saan <simmo.saan@gmail.com>
# version 2.6: fix detection of "/input search_text_here"
# 2017-04-01, Sébastien Helleu <flashcode@flashtux.org>:
# version 2.5: add option "buffer_number"
# 2017-03-02, Sébastien Helleu <flashcode@flashtux.org>:
# version 2.4: fix syntax and indentation error
# 2017-02-25, Simmo Saan <simmo.saan@gmail.com>
# version 2.3: fix fuzzy search breaking buffer number search display
# 2016-01-28, ylambda <ylambda@koalabeast.com>
# version 2.2: add option "fuzzy_search"
# 2015-11-12, nils_2 <weechatter@arcor.de>
# version 2.1: fix problem with buffer short_name "weechat", using option
# "use_core_instead_weechat", see:
# https://github.com/weechat/weechat/issues/574
# 2014-05-12, Sébastien Helleu <flashcode@flashtux.org>:
# version 2.0: add help on options, replace option "sort_by_activity" by
# "sort" (add sort by name and first match at beginning of
# name and by number), PEP8 compliance
# 2012-11-26, Nei <anti.teamidiot.de>
# version 1.9: add auto_jump option to automatically go to buffer when it
# is uniquely selected
# 2012-09-17, Sébastien Helleu <flashcode@flashtux.org>:
# version 1.8: fix jump to non-active merged buffers (jump with buffer name
# instead of number)
# 2012-01-03 nils_2 <weechatter@arcor.de>
# version 1.7: add option "use_core_instead_weechat"
# 2012-01-03, Sébastien Helleu <flashcode@flashtux.org>:
# version 1.6: make script compatible with Python 3.x
# 2011-08-24, stfn <stfnmd@googlemail.com>:
# version 1.5: /go with name argument jumps directly to buffer
# Remember cursor position in buffer input
# 2011-05-31, Elián Hanisch <lambdae2@gmail.com>:
# version 1.4: Sort list of buffers by activity.
# 2011-04-25, Sébastien Helleu <flashcode@flashtux.org>:
# version 1.3: add info "go_running" (used by script input_lock.rb)
# 2010-11-01, Sébastien Helleu <flashcode@flashtux.org>:
# version 1.2: use high priority for hooks to prevent conflict with other
# plugins/scripts (WeeChat >= 0.3.4 only)
# 2010-03-25, Elián Hanisch <lambdae2@gmail.com>:
# version 1.1: use a space to match the end of a string
# 2009-11-16, Sébastien Helleu <flashcode@flashtux.org>:
# version 1.0: add new option to display short names
# 2009-06-15, Sébastien Helleu <flashcode@flashtux.org>:
# version 0.9: fix typo in /help go with command /key
# 2009-05-16, Sébastien Helleu <flashcode@flashtux.org>:
# version 0.8: search buffer by number, fix bug when window is split
# 2009-05-03, Sébastien Helleu <flashcode@flashtux.org>:
# version 0.7: eat tab key (do not complete input, just move buffer
# pointer)
# 2009-05-02, Sébastien Helleu <flashcode@flashtux.org>:
# version 0.6: sync with last API changes
# 2009-03-22, Sébastien Helleu <flashcode@flashtux.org>:
# version 0.5: update modifier signal name for input text display,
# fix arguments for function string_remove_color
# 2009-02-18, Sébastien Helleu <flashcode@flashtux.org>:
# version 0.4: do not hook command and init options if register failed
# 2009-02-08, Sébastien Helleu <flashcode@flashtux.org>:
# version 0.3: case insensitive search for buffers names
# 2009-02-08, Sébastien Helleu <flashcode@flashtux.org>:
# version 0.2: add help about Tab key
# 2009-02-08, Sébastien Helleu <flashcode@flashtux.org>:
# version 0.1: initial release
#
"""
Quick jump to buffers.
(this script requires WeeChat 0.3.0 or newer)
"""
from __future__ import print_function
SCRIPT_NAME = 'go'
SCRIPT_AUTHOR = 'Sébastien Helleu <flashcode@flashtux.org>'
SCRIPT_VERSION = '2.6'
SCRIPT_LICENSE = 'GPL3'
SCRIPT_DESC = 'Quick jump to buffers'
SCRIPT_COMMAND = 'go'
IMPORT_OK = True
try:
import weechat
except ImportError:
print('This script must be run under WeeChat.')
print('Get WeeChat now at: http://www.weechat.org/')
IMPORT_OK = False
import re
# script options
SETTINGS = {
'color_number': (
'yellow,magenta',
'color for buffer number (not selected)'),
'color_number_selected': (
'yellow,red',
'color for selected buffer number'),
'color_name': (
'black,cyan',
'color for buffer name (not selected)'),
'color_name_selected': (
'black,brown',
'color for a selected buffer name'),
'color_name_highlight': (
'red,cyan',
'color for highlight in buffer name (not selected)'),
'color_name_highlight_selected': (
'red,brown',
'color for highlight in a selected buffer name'),
'message': (
'Go to: ',
'message to display before list of buffers'),
'short_name': (
'off',
'display and search in short names instead of buffer name'),
'sort': (
'number,beginning',
'comma-separated list of keys to sort buffers '
'(the order is important, sorts are performed in the given order): '
'name = sort by name (or short name), ',
'hotlist = sort by hotlist order, '
'number = first match a buffer number before digits in name, '
'beginning = first match at beginning of names (or short names); '
'the default sort of buffers is by numbers'),
'use_core_instead_weechat': (
'off',
'use name "core" instead of "weechat" for core buffer'),
'auto_jump': (
'off',
'automatically jump to buffer when it is uniquely selected'),
'fuzzy_search': (
'off',
'search buffer matches using approximation'),
'buffer_number': (
'on',
'display buffer number'),
}
# hooks management
HOOK_COMMAND_RUN = {
'input': ('/input *', 'go_command_run_input'),
'buffer': ('/buffer *', 'go_command_run_buffer'),
'window': ('/window *', 'go_command_run_window'),
}
hooks = {}
# input before command /go (we'll restore it later)
saved_input = ''
saved_input_pos = 0
# last user input (if changed, we'll update list of matching buffers)
old_input = None
# matching buffers
buffers = []
buffers_pos = 0
def go_option_enabled(option):
"""Checks if a boolean script option is enabled or not."""
return weechat.config_string_to_boolean(weechat.config_get_plugin(option))
def go_info_running(data, info_name, arguments):
"""Returns "1" if go is running, otherwise "0"."""
return '1' if 'modifier' in hooks else '0'
def go_unhook_one(hook):
"""Unhook something hooked by this script."""
global hooks
if hook in hooks:
weechat.unhook(hooks[hook])
del hooks[hook]
def go_unhook_all():
"""Unhook all."""
go_unhook_one('modifier')
for hook in HOOK_COMMAND_RUN:
go_unhook_one(hook)
def go_hook_all():
"""Hook command_run and modifier."""
global hooks
priority = ''
version = weechat.info_get('version_number', '') or 0
# use high priority for hook to prevent conflict with other plugins/scripts
# (WeeChat >= 0.3.4 only)
if int(version) >= 0x00030400:
priority = '2000|'
for hook, value in HOOK_COMMAND_RUN.items():
if hook not in hooks:
hooks[hook] = weechat.hook_command_run(
'%s%s' % (priority, value[0]),
value[1], '')
if 'modifier' not in hooks:
hooks['modifier'] = weechat.hook_modifier(
'input_text_display_with_cursor', 'go_input_modifier', '')
def go_start(buf):
"""Start go on buffer."""
global saved_input, saved_input_pos, old_input, buffers_pos
go_hook_all()
saved_input = weechat.buffer_get_string(buf, 'input')
saved_input_pos = weechat.buffer_get_integer(buf, 'input_pos')
weechat.buffer_set(buf, 'input', '')
old_input = None
buffers_pos = 0
def go_end(buf):
"""End go on buffer."""
global saved_input, saved_input_pos, old_input
go_unhook_all()
weechat.buffer_set(buf, 'input', saved_input)
weechat.buffer_set(buf, 'input_pos', str(saved_input_pos))
old_input = None
def go_match_beginning(buf, string):
"""Check if a string matches the beginning of buffer name/short name."""
if not string:
return False
esc_str = re.escape(string)
if re.search(r'^#?' + esc_str, buf['name']) \
or re.search(r'^#?' + esc_str, buf['short_name']):
return True
return False
def go_match_fuzzy(name, string):
"""Check if string matches name using approximation."""
if not string:
return False
name_len = len(name)
string_len = len(string)
if string_len > name_len:
return False
if name_len == string_len:
return name == string
# Attempt to match all chars somewhere in name
prev_index = -1
for i, char in enumerate(string):
index = name.find(char, prev_index+1)
if index == -1:
return False
prev_index = index
return True
def go_now(buf, args):
"""Go to buffer specified by args."""
listbuf = go_matching_buffers(args)
if not listbuf:
return
# prefer buffer that matches at beginning (if option is enabled)
if 'beginning' in weechat.config_get_plugin('sort').split(','):
for index in range(len(listbuf)):
if go_match_beginning(listbuf[index], args):
weechat.command(buf,
'/buffer ' + str(listbuf[index]['full_name']))
return
# jump to first buffer in matching buffers by default
weechat.command(buf, '/buffer ' + str(listbuf[0]['full_name']))
def go_cmd(data, buf, args):
"""Command "/go": just hook what we need."""
global hooks
if args:
go_now(buf, args)
elif 'modifier' in hooks:
go_end(buf)
else:
go_start(buf)
return weechat.WEECHAT_RC_OK
def go_matching_buffers(strinput):
"""Return a list with buffers matching user input."""
global buffers_pos
listbuf = []
if len(strinput) == 0:
buffers_pos = 0
strinput = strinput.lower()
infolist = weechat.infolist_get('buffer', '', '')
while weechat.infolist_next(infolist):
short_name = weechat.infolist_string(infolist, 'short_name')
if go_option_enabled('short_name'):
name = weechat.infolist_string(infolist, 'short_name')
else:
name = weechat.infolist_string(infolist, 'name')
if name == 'weechat' \
and go_option_enabled('use_core_instead_weechat') \
and weechat.infolist_string(infolist, 'plugin_name') == 'core':
name = 'core'
number = weechat.infolist_integer(infolist, 'number')
full_name = weechat.infolist_string(infolist, 'full_name')
if not full_name:
full_name = '%s.%s' % (
weechat.infolist_string(infolist, 'plugin_name'),
weechat.infolist_string(infolist, 'name'))
pointer = weechat.infolist_pointer(infolist, 'pointer')
matching = name.lower().find(strinput) >= 0
if not matching and strinput[-1] == ' ':
matching = name.lower().endswith(strinput.strip())
if not matching and go_option_enabled('fuzzy_search'):
matching = go_match_fuzzy(name.lower(), strinput)
if not matching and strinput.isdigit():
matching = str(number).startswith(strinput)
if len(strinput) == 0 or matching:
listbuf.append({
'number': number,
'short_name': short_name,
'name': name,
'full_name': full_name,
'pointer': pointer,
})
weechat.infolist_free(infolist)
# sort buffers
hotlist = []
infolist = weechat.infolist_get('hotlist', '', '')
while weechat.infolist_next(infolist):
hotlist.append(
weechat.infolist_pointer(infolist, 'buffer_pointer'))
weechat.infolist_free(infolist)
last_index_hotlist = len(hotlist)
def _sort_name(buf):
"""Sort buffers by name (or short name)."""
return buf['name']
def _sort_hotlist(buf):
"""Sort buffers by hotlist order."""
try:
return hotlist.index(buf['pointer'])
except ValueError:
# not in hotlist, always last.
return last_index_hotlist
def _sort_match_number(buf):
"""Sort buffers by match on number."""
return 0 if str(buf['number']) == strinput else 1
def _sort_match_beginning(buf):
"""Sort buffers by match at beginning."""
return 0 if go_match_beginning(buf, strinput) else 1
funcs = {
'name': _sort_name,
'hotlist': _sort_hotlist,
'number': _sort_match_number,
'beginning': _sort_match_beginning,
}
for key in weechat.config_get_plugin('sort').split(','):
if key in funcs:
listbuf = sorted(listbuf, key=funcs[key])
if not strinput:
index = [i for i, buf in enumerate(listbuf)
if buf['pointer'] == weechat.current_buffer()]
if index:
buffers_pos = index[0]
return listbuf
def go_buffers_to_string(listbuf, pos, strinput):
"""Return string built with list of buffers found (matching user input)."""
string = ''
strinput = strinput.lower()
for i in range(len(listbuf)):
selected = '_selected' if i == pos else ''
buffer_name = listbuf[i]['name']
index = buffer_name.lower().find(strinput)
if index >= 0:
index2 = index + len(strinput)
name = '%s%s%s%s%s' % (
buffer_name[:index],
weechat.color(weechat.config_get_plugin(
'color_name_highlight' + selected)),
buffer_name[index:index2],
weechat.color(weechat.config_get_plugin(
'color_name' + selected)),
buffer_name[index2:])
elif go_option_enabled("fuzzy_search") and \
go_match_fuzzy(buffer_name.lower(), strinput):
name = ""
prev_index = -1
for char in strinput.lower():
index = buffer_name.lower().find(char, prev_index+1)
if prev_index < 0:
name += buffer_name[:index]
name += weechat.color(weechat.config_get_plugin(
'color_name_highlight' + selected))
if prev_index >= 0 and index > prev_index+1:
name += weechat.color(weechat.config_get_plugin(
'color_name' + selected))
name += buffer_name[prev_index+1:index]
name += weechat.color(weechat.config_get_plugin(
'color_name_highlight' + selected))
name += buffer_name[index]
prev_index = index
name += weechat.color(weechat.config_get_plugin(
'color_name' + selected))
name += buffer_name[prev_index+1:]
else:
name = buffer_name
string += ' '
if go_option_enabled('buffer_number'):
string += '%s%s' % (
weechat.color(weechat.config_get_plugin(
'color_number' + selected)),
str(listbuf[i]['number']))
string += '%s%s%s' % (
weechat.color(weechat.config_get_plugin(
'color_name' + selected)),
name,
weechat.color('reset'))
return ' ' + string if string else ''
def go_input_modifier(data, modifier, modifier_data, string):
"""This modifier is called when input text item is built by WeeChat.
This is commonly called after changes in input or cursor move: it builds
a new input with prefix ("Go to:"), and suffix (list of buffers found).
"""
global old_input, buffers, buffers_pos
if modifier_data != weechat.current_buffer():
return ''
names = ''
new_input = weechat.string_remove_color(string, '')
new_input = new_input.lstrip()
if old_input is None or new_input != old_input:
old_buffers = buffers
buffers = go_matching_buffers(new_input)
if buffers != old_buffers and len(new_input) > 0:
if len(buffers) == 1 and go_option_enabled('auto_jump'):
weechat.command(modifier_data, '/wait 1ms /input return')
buffers_pos = 0
old_input = new_input
names = go_buffers_to_string(buffers, buffers_pos, new_input.strip())
return weechat.config_get_plugin('message') + string + names
def go_command_run_input(data, buf, command):
"""Function called when a command "/input xxx" is run."""
global buffers, buffers_pos
if command.startswith('/input search_text') or command.startswith('/input jump'):
# search text or jump to another buffer is forbidden now
return weechat.WEECHAT_RC_OK_EAT
elif command == '/input complete_next':
# choose next buffer in list
buffers_pos += 1
if buffers_pos >= len(buffers):
buffers_pos = 0
weechat.hook_signal_send('input_text_changed',
weechat.WEECHAT_HOOK_SIGNAL_STRING, '')
return weechat.WEECHAT_RC_OK_EAT
elif command == '/input complete_previous':
# choose previous buffer in list
buffers_pos -= 1
if buffers_pos < 0:
buffers_pos = len(buffers) - 1
weechat.hook_signal_send('input_text_changed',
weechat.WEECHAT_HOOK_SIGNAL_STRING, '')
return weechat.WEECHAT_RC_OK_EAT
elif command == '/input return':
# switch to selected buffer (if any)
go_end(buf)
if len(buffers) > 0:
weechat.command(
buf, '/buffer ' + str(buffers[buffers_pos]['full_name']))
return weechat.WEECHAT_RC_OK_EAT
return weechat.WEECHAT_RC_OK
def go_command_run_buffer(data, buf, command):
"""Function called when a command "/buffer xxx" is run."""
return weechat.WEECHAT_RC_OK_EAT
def go_command_run_window(data, buf, command):
"""Function called when a command "/window xxx" is run."""
return weechat.WEECHAT_RC_OK_EAT
def go_unload_script():
"""Function called when script is unloaded."""
go_unhook_all()
return weechat.WEECHAT_RC_OK
def go_main():
"""Entry point."""
if not weechat.register(SCRIPT_NAME, SCRIPT_AUTHOR, SCRIPT_VERSION,
SCRIPT_LICENSE, SCRIPT_DESC,
'go_unload_script', ''):
return
weechat.hook_command(
SCRIPT_COMMAND,
'Quick jump to buffers', '[name]',
'name: directly jump to buffer by name (without argument, list is '
'displayed)\n\n'
'You can bind command to a key, for example:\n'
' /key bind meta-g /go\n\n'
'You can use completion key (commonly Tab and shift-Tab) to select '
'next/previous buffer in list.',
'%(buffers_names)',
'go_cmd', '')
# set default settings
version = weechat.info_get('version_number', '') or 0
for option, value in SETTINGS.items():
if not weechat.config_is_set_plugin(option):
weechat.config_set_plugin(option, value[0])
if int(version) >= 0x00030500:
weechat.config_set_desc_plugin(
option, '%s (default: "%s")' % (value[1], value[0]))
weechat.hook_info('go_running',
'Return "1" if go is running, otherwise "0"',
'',
'go_info_running', '')
if __name__ == "__main__" and IMPORT_OK:
go_main()

+ 59
- 0
config/weechat/relay.conf View File

@ -0,0 +1,59 @@
#
# weechat -- relay.conf
#
# WARNING: It is NOT recommended to edit this file by hand,
# especially if WeeChat is running.
#
# Use /set or similar command to change settings in WeeChat.
#
# For more info, see: https://weechat.org/doc/quickstart
#
[look]
auto_open_buffer = on
raw_messages = 256
[color]
client = cyan
status_active = green
status_auth_failed = lightmagenta
status_connecting = white
status_disconnected = lightred
status_waiting_auth = yellow
text = default
text_bg = default
text_selected = white
[network]
allow_empty_password = off
allowed_ips = ""
auth_timeout = 60
bind_address = ""
clients_purge_delay = 0
compression_level = 6
ipv6 = on
max_clients = 5
nonce_size = 16
password = ""
password_hash_algo = "*"
password_hash_iterations = 100000
ssl_cert_key = "%h/ssl/relay.pem"
ssl_priorities = "NORMAL:-VERS-SSL3.0"
totp_secret = ""
totp_window = 0
websocket_allowed_origins = ""
[irc]
backlog_max_minutes = 0
backlog_max_number = 1024
backlog_since_last_disconnect = on
backlog_since_last_message = off
backlog_tags = "irc_privmsg"
backlog_time_format = "[%H:%M] "
[weechat]
commands = ""
[port]
[path]

+ 14
- 0
config/weechat/ruby.conf View File

@ -0,0 +1,14 @@
#
# weechat -- ruby.conf
#
# WARNING: It is NOT recommended to edit this file by hand,
# especially if WeeChat is running.
#
# Use /set or similar command to change settings in WeeChat.
#
# For more info, see: https://weechat.org/doc/quickstart
#
[look]
check_license = off
eval_keep_context = on

+ 57
- 0
config/weechat/script.conf View File

@ -0,0 +1,57 @@
#
# weechat -- script.conf
#
# WARNING: It is NOT recommended to edit this file by hand,
# especially if WeeChat is running.
#
# Use /set or similar command to change settings in WeeChat.
#
# For more info, see: https://weechat.org/doc/quickstart
#
[look]
columns = "%s %n %V %v %u | %d | %t"
diff_color = on
diff_command = "auto"
display_source = on
quiet_actions = on
sort = "i,p,n"
translate_description = on
use_keys = on
[color]
status_autoloaded = cyan
status_held = white
status_installed = lightcyan
status_obsolete = lightmagenta
status_popular = yellow
status_running = lightgreen
status_unknown = lightred
text = default
text_bg = default
text_bg_selected = red
text_date = default
text_date_selected = white
text_delimiters = default
text_description = default
text_description_selected = white
text_extension = default
text_extension_selected = white
text_name = cyan
text_name_selected = lightcyan
text_selected = white
text_tags = brown
text_tags_selected = yellow
text_version = magenta
text_version_loaded = default
text_version_loaded_selected = white
text_version_selected = lightmagenta
[scripts]
autoload = on
cache_expire = 1440
download_enabled = on
download_timeout = 30
hold = ""
path = "%h/script"
url = "https://weechat.org/files/plugins.xml.gz"

BIN
config/weechat/script/plugins.xml.gz View File


+ 20
- 0
config/weechat/sec.conf View File

@ -0,0 +1,20 @@
#
# weechat -- sec.conf
#
# WARNING: It is NOT recommended to edit this file by hand,
# especially if WeeChat is running.
#
# Use /set or similar command to change settings in WeeChat.
#
# For more info, see: https://weechat.org/doc/quickstart
#
[crypt]
cipher = aes256
hash_algo = sha256
passphrase_command = ""
salt = on
[data]
__passphrase__ = on
freenode_password = "F5FA53FD70C3D1125F2CF4C43A6C450931280E2CA4B9327C7388E1C3AD9A2E45A42C9696703F82874CDA7092F1D3FD362A6622A447702B435E000F"

+ 33
- 0
config/weechat/spell.conf View File

@ -0,0 +1,33 @@
#
# weechat -- spell.conf
#
# WARNING: It is NOT recommended to edit this file by hand,
# especially if WeeChat is running.
#
# Use /set or similar command to change settings in WeeChat.
#
# For more info, see: https://weechat.org/doc/quickstart
#
[color]
misspelled = lightred
suggestion = default
suggestion_delimiter_dict = cyan
suggestion_delimiter_word = cyan
[check]
commands = "away,command,cycle,kick,kickban,me,msg,notice,part,query,quit,topic"
default_dict = ""
during_search = off
enabled = off
real_time = off
suggestions = -1
word_min_length = 2
[dict]
[look]
suggestion_delimiter_dict = " / "
suggestion_delimiter_word = ","
[option]

+ 14
- 0
config/weechat/tcl.conf View File

@ -0,0 +1,14 @@
#
# weechat -- tcl.conf
#
# WARNING: It is NOT recommended to edit this file by hand,
# especially if WeeChat is running.
#
# Use /set or similar command to change settings in WeeChat.
#
# For more info, see: https://weechat.org/doc/quickstart
#
[look]
check_license = off
eval_keep_context = on

+ 67
- 0
config/weechat/trigger.conf View File

@ -0,0 +1,67 @@
#
# weechat -- trigger.conf
#
# WARNING: It is NOT recommended to edit this file by hand,
# especially if WeeChat is running.
#
# Use /set or similar command to change settings in WeeChat.
#
# For more info, see: https://weechat.org/doc/quickstart
#
[look]
enabled = on
monitor_strip_colors = off
[color]
flag_command = lightgreen
flag_conditions = yellow
flag_post_action = lightblue
flag_regex = lightcyan
flag_return_code = lightmagenta
regex = white
replace = cyan
trigger = green
trigger_disabled = red
[trigger]
beep.arguments = ""
beep.command = "/print -beep"
beep.conditions = "${tg_displayed} && ${tg_tags} !!- ,notify_none, && (${tg_highlight} || ${tg_msg_pv})"
beep.enabled = on
beep.hook = print
beep.post_action = none
beep.regex = ""
beep.return_code = ok
cmd_pass.arguments = "5000|input_text_display;5000|history_add;5000|irc_command_auth"
cmd_pass.command = ""
cmd_pass.conditions = ""
cmd_pass.enabled = on
cmd_pass.hook = modifier
cmd_pass.post_action = none
cmd_pass.regex = "==^((/(msg|m|quote) +(-server +[^ ]+ +)?nickserv +(id|identify|set +password|ghost +[^ ]+|release +[^ ]+|regain +[^ ]+|recover +[^ ]+) +)|/oper +[^ ]+ +|/quote +pass +|/secure +(passphrase|decrypt|set +[^ ]+) +)(.*)==${re:1}${hide:*,${re:+}}"
cmd_pass.return_code = ok
cmd_pass_register.arguments = "5000|input_text_display;5000|history_add;5000|irc_command_auth"
cmd_pass_register.command = ""
cmd_pass_register.conditions = ""
cmd_pass_register.enabled = on
cmd_pass_register.hook = modifier
cmd_pass_register.post_action = none
cmd_pass_register.regex = "==^(/(msg|m|quote) +nickserv +register +)([^ ]+)(.*)==${re:1}${hide:*,${re:3}}${re:4}"
cmd_pass_register.return_code = ok
msg_auth.arguments = "5000|irc_message_auth"
msg_auth.command = ""
msg_auth.conditions = ""
msg_auth.enabled = on
msg_auth.hook = modifier
msg_auth.post_action = none
msg_auth.regex = "==^(.*(id|identify|set +password|register|ghost +[^ ]+|release +[^ ]+|regain +[^ ]+|recover +[^ ]+) +)(.*)==${re:1}${hide:*,${re:+}}"
msg_auth.return_code = ok
server_pass.arguments = "5000|input_text_display;5000|history_add"
server_pass.command = ""
server_pass.conditions = ""
server_pass.enabled = on
server_pass.hook = modifier
server_pass.post_action = none
server_pass.regex = "==^(/(server|connect) .*-(sasl_)?password=)([^ ]+)(.*)==${re:1}${hide:*,${re:4}}${re:5}"
server_pass.return_code = ok

+ 679
- 0
config/weechat/weechat.conf View File

@ -0,0 +1,679 @@
#
# weechat -- weechat.conf
#
# WARNING: It is NOT recommended to edit this file by hand,
# especially if WeeChat is running.
#
# Use /set or similar command to change settings in WeeChat.
#
# For more info, see: https://weechat.org/doc/quickstart
#
[debug]
[startup]
command_after_plugins = ""
command_before_plugins = ""
display_logo = on
display_version = on
sys_rlimit = ""
[look]
align_end_of_lines = message
align_multiline_words = on
bar_more_down = "++"
bar_more_left = "<<"
bar_more_right = ">>"
bar_more_up = "--"
bare_display_exit_on_input = on
bare_display_time_format = "%H:%M"
buffer_auto_renumber = on
buffer_notify_default = all
buffer_position = end
buffer_search_case_sensitive = off
buffer_search_force_default = off
buffer_search_regex = off
buffer_search_where = prefix_message
buffer_time_format = "%H:%M:%S"
buffer_time_same = ""
color_basic_force_bold = off
color_inactive_buffer = on
color_inactive_message = on
color_inactive_prefix = on
color_inactive_prefix_buffer = on
color_inactive_time = off
color_inactive_window = on
color_nick_offline = off
color_pairs_auto_reset = 5
color_real_white = off
command_chars = ""
command_incomplete = off
confirm_quit = off
confirm_upgrade = off
day_change = on
day_change_message_1date = "-- %a, %d %b %Y --"
day_change_message_2dates = "-- %%a, %%d %%b %%Y (%a, %d %b %Y) --"
eat_newline_glitch = off
emphasized_attributes = ""
highlight = ""
highlight_regex = ""
highlight_tags = ""
hotlist_add_conditions = "${away} || ${buffer.num_displayed} == 0 || ${info:relay_client_count,weechat,connected} > 0"
hotlist_buffer_separator = ", "
hotlist_count_max = 2
hotlist_count_min_msg = 2
hotlist_names_count = 3
hotlist_names_length = 0
hotlist_names_level = 12
hotlist_names_merged_buffers = off
hotlist_prefix = "H: "
hotlist_remove = merged
hotlist_short_names = on
hotlist_sort = group_time_asc
hotlist_suffix = ""
hotlist_unique_numbers = on
hotlist_update_on_buffer_switch = on
input_cursor_scroll = 20
input_share = none
input_share_overwrite = off
input_undo_max = 32
item_away_message = on
item_buffer_filter = "*"
item_buffer_zoom = "!"
item_mouse_status = "M"
item_time_format = "%H:%M"
jump_current_to_previous_buffer = on
jump_previous_buffer_when_closing = on
jump_smart_back_to_buffer = on
key_bind_safe = on
key_grab_delay = 800
mouse = off
mouse_timer_delay = 100
nick_color_force = ""
nick_color_hash = djb2
nick_color_hash_salt = ""
nick_color_stop_chars = "_|["
nick_prefix = ""
nick_suffix = ""
paste_auto_add_newline = on
paste_bracketed = on
paste_bracketed_timer_delay = 10
paste_max_lines = 1
prefix_action = " *"
prefix_align = right
prefix_align_max = 0
prefix_align_min = 0
prefix_align_more = "+"
prefix_align_more_after = on
prefix_buffer_align = right
prefix_buffer_align_max = 0
prefix_buffer_align_more = "+"
prefix_buffer_align_more_after = on
prefix_error = "=!="
prefix_join = "-->"
prefix_network = "--"
prefix_quit = "<--"
prefix_same_nick = ""
prefix_same_nick_middle = ""
prefix_suffix = "|"
quote_nick_prefix = "<"
quote_nick_suffix = ">"
quote_time_format = "%H:%M:%S"
read_marker = line
read_marker_always_show = off
read_marker_string = "- "
read_marker_update_on_buffer_switch = on
save_config_on_exit = on
save_config_with_fsync = off
save_layout_on_exit = none
scroll_amount = 3
scroll_bottom_after_switch = off
scroll_page_percent = 100
search_text_not_found_alert = on
separator_horizontal = "-"
separator_vertical = ""
tab_width = 1
time_format = "%a, %d %b %Y %T"
window_auto_zoom = off
window_separator_horizontal = on
window_separator_vertical = on
window_title = ""
word_chars_highlight = "!\u00A0,-,_,|,alnum"
word_chars_input = "!\u00A0,-,_,|,alnum"
[palette]
[color]
bar_more = lightmagenta
chat = default
chat_bg = default
chat_buffer = white
chat_channel = white
chat_day_change = cyan
chat_delimiters = green
chat_highlight = yellow
chat_highlight_bg = magenta
chat_host = cyan
chat_inactive_buffer = default
chat_inactive_window = default
chat_nick = lightcyan
chat_nick_colors = "cyan,magenta,green,brown,lightblue,default,lightcyan,lightmagenta,lightgreen,blue"
chat_nick_offline = default
chat_nick_offline_highlight = default
chat_nick_offline_highlight_bg = blue
chat_nick_other = cyan
chat_nick_prefix = green
chat_nick_self = white
chat_nick_suffix = green
chat_prefix_action = white
chat_prefix_buffer = brown
chat_prefix_buffer_inactive_buffer = default
chat_prefix_error = yellow
chat_prefix_join = lightgreen
chat_prefix_more = lightmagenta
chat_prefix_network = magenta
chat_prefix_quit = lightred
chat_prefix_suffix = green
chat_read_marker = magenta
chat_read_marker_bg = default
chat_server = brown
chat_tags = red
chat_text_found = yellow
chat_text_found_bg = lightmagenta
chat_time = default
chat_time_delimiters = brown
chat_value = cyan
chat_value_null = blue
emphasized = yellow
emphasized_bg = magenta
input_actions = lightgreen
input_text_not_found = red
item_away = yellow
nicklist_away = cyan
nicklist_group = green
separator = blue
status_count_highlight = magenta
status_count_msg = brown
status_count_other = default
status_count_private = green
status_data_highlight = lightmagenta
status_data_msg = yellow
status_data_other = default
status_data_private = lightgreen
status_filter = green
status_more = yellow
status_mouse = green
status_name = white
status_name_ssl = lightgreen
status_nicklist_count = default
status_number = yellow
status_time = default
[completion]
base_word_until_cursor = on
command_inline = on
default_template = "%(nicks)|%(irc_channels)"
nick_add_space = on
nick_case_sensitive = off
nick_completer = ": "
nick_first_only = off
nick_ignore_chars = "[]`_-^"
partial_completion_alert = on
partial_completion_command = off
partial_completion_command_arg = off
partial_completion_count = on
partial_completion_other = off
partial_completion_templates = "config_options"
[history]
display_default = 5
max_buffer_lines_minutes = 0
max_buffer_lines_number = 4096
max_commands = 100
max_visited_buffers = 50
[proxy]
[network]
connection_timeout = 60
gnutls_ca_file = "/etc/ssl/certs/ca-certificates.crt"
gnutls_handshake_timeout = 30
proxy_curl = ""
[plugin]
autoload = "*"
debug = off
extension = ".so,.dll"
path = "%h/plugins"
save_config_on_unload = on
[bar]
buflist.color_bg = default
buflist.color_bg_inactive = default
buflist.color_delim = default
buflist.color_fg = default
buflist.conditions = ""
buflist.filling_left_right = vertical
buflist.filling_top_bottom = columns_vertical
buflist.hidden = off
buflist.items = "buflist"
buflist.position = left
buflist.priority = 0
buflist.separator = on
buflist.size = 0
buflist.size_max = 0
buflist.type = root
fset.color_bg = default
fset.color_bg_inactive = default
fset.color_delim = cyan
fset.color_fg = default
fset.conditions = "${buffer.full_name} == fset.fset"
fset.filling_left_right = vertical
fset.filling_top_bottom = horizontal
fset.hidden = off
fset.items = "fset"
fset.position = top
fset.priority = 0
fset.separator = on
fset.size = 3
fset.size_max = 3
fset.type = window
input.color_bg = default
input.color_bg_inactive = default
input.color_delim = cyan
input.color_fg = default
input.conditions = ""
input.filling_left_right = vertical
input.filling_top_bottom = horizontal
input.hidden = off
input.items = "[input_prompt]+(away),[input_search],[input_paste],input_text"
input.position = bottom
input.priority = 1000
input.separator = off
input.size = 0
input.size_max = 0
input.type = window
nicklist.color_bg = default
nicklist.color_bg_inactive = default
nicklist.color_delim = cyan
nicklist.color_fg = default
nicklist.conditions = "${nicklist}"
nicklist.filling_left_right = vertical
nicklist.filling_top_bottom = columns_vertical
nicklist.hidden = off
nicklist.items = "buffer_nicklist"
nicklist.position = right
nicklist.priority = 200
nicklist.separator = on
nicklist.size = 0
nicklist.size_max = 0
nicklist.type = window
status.color_bg = blue
status.color_bg_inactive = darkgray
status.color_delim = cyan
status.color_fg = default
status.conditions = ""
status.filling_left_right = vertical
status.filling_top_bottom = horizontal
status.hidden = off
status.items = "[time],[buffer_last_number],[buffer_plugin],buffer_number+:+buffer_name+(buffer_modes)+{buffer_nicklist_count}+buffer_zoom+buffer_filter,scroll,[lag],[hotlist],completion"
status.position = bottom
status.priority = 500
status.separator = off
status.size = 1
status.size_max = 0
status.type = window
title.color_bg = blue
title.color_bg_inactive = darkgray
title.color_delim = cyan
title.color_fg = default
title.conditions = ""
title.filling_left_right = vertical
title.filling_top_bottom = horizontal
title.hidden = off
title.items = "buffer_title"
title.position = top
title.priority = 500
title.separator = off
title.size = 1
title.size_max = 0
title.type = window
[layout]
[notify]
perl.highmon = none
[filter]
[key]
ctrl-? = "/input delete_previous_char"
ctrl-A = "/input move_beginning_of_line"
ctrl-B = "/input move_previous_char"
ctrl-C_ = "/input insert \x1F"
ctrl-Cb = "/input insert \x02"
ctrl-Cc = "/input insert \x03"
ctrl-Ci = "/input insert \x1D"
ctrl-Co = "/input insert \x0F"
ctrl-Cv = "/input insert \x16"
ctrl-D = "/input delete_next_char"
ctrl-E = "/input move_end_of_line"
ctrl-F = "/input move_next_char"
ctrl-H = "/input delete_previous_char"
ctrl-I = "/input complete_next"
ctrl-J = "/input return"
ctrl-K = "/input delete_end_of_line"
ctrl-L = "/window refresh"
ctrl-M = "/input return"
ctrl-N = "/buffer +1"
ctrl-P = "/buffer -1"
ctrl-R = "/input search_text_here"
ctrl-Sctrl-U = "/input set_unread"
ctrl-T = "/input transpose_chars"
ctrl-U = "/input delete_beginning_of_line"
ctrl-W = "/input delete_previous_word"
ctrl-X = "/input switch_active_buffer"
ctrl-Y = "/input clipboard_paste"
meta-ctrl-M = "/input insert \n"
meta-meta-OP = "/bar scroll buflist * b"
meta-meta-OQ = "/bar scroll buflist * e"
meta-meta2-11~ = "/bar scroll buflist * b"
meta-meta2-12~ = "/bar scroll buflist * e"
meta-meta2-1~ = "/window scroll_top"
meta-meta2-23~ = "/bar scroll nicklist * b"
meta-meta2-24~ = "/bar scroll nicklist * e"
meta-meta2-4~ = "/window scroll_bottom"
meta-meta2-5~ = "/window scroll_up"
meta-meta2-6~ = "/window scroll_down"
meta-meta2-7~ = "/window scroll_top"
meta-meta2-8~ = "/window scroll_bottom"
meta-meta2-A = "/buffer -1"
meta-meta2-B = "/buffer +1"
meta-meta2-C = "/buffer +1"
meta-meta2-D = "/buffer -1"
meta-- = "/filter toggle @"
meta-/ = "/input jump_last_buffer_displayed"
meta-0 = "/buffer *10"
meta-1 = "/buffer *1"
meta-2 = "/buffer *2"
meta-3 = "/buffer *3"
meta-4 = "/buffer *4"
meta-5 = "/buffer *5"
meta-6 = "/buffer *6"
meta-7 = "/buffer *7"
meta-8 = "/buffer *8"
meta-9 = "/buffer *9"
meta-< = "/input jump_previously_visited_buffer"
meta-= = "/filter toggle"
meta-> = "/input jump_next_visited_buffer"
meta-B = "/buflist toggle"
meta-N = "/bar toggle nicklist"
meta-OA = "/input history_global_previous"
meta-OB = "/input history_global_next"
meta-OC = "/input move_next_word"
meta-OD = "/input move_previous_word"
meta-OF = "/input move_end_of_line"
meta-OH = "/input move_beginning_of_line"
meta-OP = "/bar scroll buflist * -100%"
meta-OQ = "/bar scroll buflist * +100%"
meta-Oa = "/input history_global_previous"
meta-Ob = "/input history_global_next"
meta-Oc = "/input move_next_word"
meta-Od = "/input move_previous_word"
meta2-11^ = "/bar scroll buflist * -100%"
meta2-11~ = "/bar scroll buflist * -100%"
meta2-12^ = "/bar scroll buflist * +100%"
meta2-12~ = "/bar scroll buflist * +100%"
meta2-15~ = "/buffer -1"
meta2-17~ = "/buffer +1"
meta2-18~ = "/window -1"
meta2-19~ = "/window +1"
meta2-1;3A = "/buffer -1"
meta2-1;3B = "/buffer +1"
meta2-1;3C = "/buffer +1"
meta2-1;3D = "/buffer -1"
meta2-1;3F = "/window scroll_bottom"
meta2-1;3H = "/window scroll_top"
meta2-1;3P = "/bar scroll buflist * b"
meta2-1;3Q = "/bar scroll buflist * e"
meta2-1;5A = "/input history_global_previous"
meta2-1;5B = "/input history_global_next"
meta2-1;5C = "/input move_next_word"
meta2-1;5D = "/input move_previous_word"
meta2-1;5P = "/bar scroll buflist * -100%"
meta2-1;5Q = "/bar scroll buflist * +100%"
meta2-1~ = "/input move_beginning_of_line"
meta2-200~ = "/input paste_start"
meta2-201~ = "/input paste_stop"
meta2-20~ = "/bar scroll title * -30%"
meta2-21~ = "/bar scroll title * +30%"
meta2-23;3~ = "/bar scroll nicklist * b"
meta2-23;5~ = "/bar scroll nicklist * -100%"
meta2-23^ = "/bar scroll nicklist * -100%"
meta2-23~ = "/bar scroll nicklist * -100%"
meta2-24;3~ = "/bar scroll nicklist * e"
meta2-24;5~ = "/bar scroll nicklist * +100%"
meta2-24^ = "/bar scroll nicklist * +100%"
meta2-24~ = "/bar scroll nicklist * +100%"
meta2-3~ = "/input delete_next_char"
meta2-4~ = "/input move_end_of_line"
meta2-5;3~ = "/window scroll_up"
meta2-5~ = "/window page_up"
meta2-6;3~ = "/window scroll_down"
meta2-6~ = "/window page_down"
meta2-7~ = "/input move_beginning_of_line"
meta2-8~ = "/input move_end_of_line"
meta2-A = "/input history_previous"
meta2-B = "/input history_next"
meta2-C = "/input move_next_char"
meta2-D = "/input move_previous_char"
meta2-F = "/input move_end_of_line"
meta2-G = "/window page_down"
meta2-H = "/input move_beginning_of_line"
meta2-I = "/window page_up"
meta2-Z = "/input complete_previous"
meta2-[E = "/buffer -1"
meta-_ = "/input redo"
meta-a = "/input jump_smart"
meta-b = "/input move_previous_word"
meta-d = "/input delete_next_word"
meta-f = "/input move_next_word"
meta-h = "/input hotlist_clear"
meta-jmeta-f = "/buffer -"
meta-jmeta-l = "/buffer +"
meta-jmeta-r = "/server raw"
meta-jmeta-s = "/server jump"
meta-j01 = "/buffer *1"
meta-j02 = "/buffer *2"
meta-j03 = "/buffer *3"
meta-j04 = "/buffer *4"
meta-j05 = "/buffer *5"
meta-j06 = "/buffer *6"
meta-j07 = "/buffer *7"
meta-j08 = "/buffer *8"
meta-j09 = "/buffer *9"
meta-j10 = "/buffer *10"
meta-j11 = "/buffer *11"
meta-j12 = "/buffer *12"
meta-j13 = "/buffer *13"
meta-j14 = "/buffer *14"
meta-j15 = "/buffer *15"
meta-j16 = "/buffer *16"
meta-j17 = "/buffer *17"
meta-j18 = "/buffer *18"
meta-j19 = "/buffer *19"
meta-j20 = "/buffer *20"
meta-j21 = "/buffer *21"
meta-j22 = "/buffer *22"
meta-j23 = "/buffer *23"
meta-j24 = "/buffer *24"
meta-j25 = "/buffer *25"
meta-j26 = "/buffer *26"
meta-j27 = "/buffer *27"
meta-j28 = "/buffer *28"
meta-j29 = "/buffer *29"
meta-j30 = "/buffer *30"
meta-j31 = "/buffer *31"
meta-j32 = "/buffer *32"
meta-j33 = "/buffer *33"
meta-j34 = "/buffer *34"
meta-j35 = "/buffer *35"
meta-j36 = "/buffer *36"
meta-j37 = "/buffer *37"
meta-j38 = "/buffer *38"
meta-j39 = "/buffer *39"
meta-j40 = "/buffer *40"
meta-j41 = "/buffer *41"
meta-j42 = "/buffer *42"
meta-j43 = "/buffer *43"
meta-j44 = "/buffer *44"
meta-j45 = "/buffer *45"
meta-j46 = "/buffer *46"
meta-j47 = "/buffer *47"
meta-j48 = "/buffer *48"
meta-j49 = "/buffer *49"
meta-j50 = "/buffer *50"
meta-j51 = "/buffer *51"
meta-j52 = "/buffer *52"
meta-j53 = "/buffer *53"
meta-j54 = "/buffer *54"
meta-j55 = "/buffer *55"
meta-j56 = "/buffer *56"
meta-j57 = "/buffer *57"
meta-j58 = "/buffer *58"
meta-j59 = "/buffer *59"
meta-j60 = "/buffer *60"
meta-j61 = "/buffer *61"
meta-j62 = "/buffer *62"
meta-j63 = "/buffer *63"
meta-j64 = "/buffer *64"
meta-j65 = "/buffer *65"
meta-j66 = "/buffer *66"
meta-j67 = "/buffer *67"
meta-j68 = "/buffer *68"
meta-j69 = "/buffer *69"
meta-j70 = "/buffer *70"
meta-j71 = "/buffer *71"
meta-j72 = "/buffer *72"
meta-j73 = "/buffer *73"
meta-j74 = "/buffer *74"
meta-j75 = "/buffer *75"
meta-j76 = "/buffer *76"
meta-j77 = "/buffer *77"
meta-j78 = "/buffer *78"
meta-j79 = "/buffer *79"
meta-j80 = "/buffer *80"
meta-j81 = "/buffer *81"
meta-j82 = "/buffer *82"
meta-j83 = "/buffer *83"
meta-j84 = "/buffer *84"
meta-j85 = "/buffer *85"
meta-j86 = "/buffer *86"
meta-j87 = "/buffer *87"
meta-j88 = "/buffer *88"
meta-j89 = "/buffer *89"
meta-j90 = "/buffer *90"
meta-j91 = "/buffer *91"
meta-j92 = "/buffer *92"
meta-j93 = "/buffer *93"
meta-j94 = "/buffer *94"
meta-j95 = "/buffer *95"
meta-j96 = "/buffer *96"
meta-j97 = "/buffer *97"
meta-j98 = "/buffer *98"
meta-j99 = "/buffer *99"
meta-k = "/input grab_key_command"
meta-l = "/window bare"
meta-m = "/mute mouse toggle"
meta-n = "/window scroll_next_highlight"
meta-p = "/window scroll_previous_highlight"
meta-r = "/input delete_line"
meta-s = "/mute spell toggle"
meta-u = "/window scroll_unread"
meta-wmeta-meta2-A = "/window up"
meta-wmeta-meta2-B = "/window down"
meta-wmeta-meta2-C = "/window right"
meta-wmeta-meta2-D = "/window left"
meta-wmeta2-1;3A = "/window up"
meta-wmeta2-1;3B = "/window down"
meta-wmeta2-1;3C = "/window right"
meta-wmeta2-1;3D = "/window left"
meta-wmeta-b = "/window balance"
meta-wmeta-s = "/window swap"
meta-x = "/input zoom_merged_buffer"
meta-z = "/window zoom"
ctrl-_ = "/input undo"
[key_search]
ctrl-I = "/input search_switch_where"
ctrl-J = "/input search_stop_here"
ctrl-M = "/input search_stop_here"
ctrl-Q = "/input search_stop"
ctrl-R = "/input search_switch_regex"
meta2-A = "/input search_previous"
meta2-B = "/input search_next"
meta-c = "/input search_switch_case"
[key_cursor]
ctrl-J = "/cursor stop"
ctrl-M = "/cursor stop"
meta-meta2-A = "/cursor move area_up"
meta-meta2-B = "/cursor move area_down"
meta-meta2-C = "/cursor move area_right"
meta-meta2-D = "/cursor move area_left"
meta2-1;3A = "/cursor move area_up"
meta2-1;3B = "/cursor move area_down"
meta2-1;3C = "/cursor move area_right"
meta2-1;3D = "/cursor move area_left"
meta2-A = "/cursor move up"
meta2-B = "/cursor move down"
meta2-C = "/cursor move right"
meta2-D = "/cursor move left"
@item(buffer_nicklist):K = "/window ${_window_number};/kickban ${nick}"
@item(buffer_nicklist):b = "/window ${_window_number};/ban ${nick}"
@item(buffer_nicklist):k = "/window ${_window_number};/kick ${nick}"
@item(buffer_nicklist):q = "/window ${_window_number};/query ${nick};/cursor stop"
@item(buffer_nicklist):w = "/window ${_window_number};/whois ${nick}"
@chat:Q = "hsignal:chat_quote_time_prefix_message;/cursor stop"
@chat:m = "hsignal:chat_quote_message;/cursor stop"
@chat:q = "hsignal:chat_quote_prefix_message;/cursor stop"
[key_mouse]
@bar(buflist):ctrl-wheeldown = "hsignal:buflist_mouse"
@bar(buflist):ctrl-wheelup = "hsignal:buflist_mouse"
@bar(input):button2 = "/input grab_mouse_area"
@bar(nicklist):button1-gesture-down = "/bar scroll nicklist ${_window_number} +100%"
@bar(nicklist):button1-gesture-down-long = "/bar scroll nicklist ${_window_number} e"
@bar(nicklist):button1-gesture-up = "/bar scroll nicklist ${_window_number} -100%"
@bar(nicklist):button1-gesture-up-long = "/bar scroll nicklist ${_window_number} b"
@chat(fset.fset):button1 = "/window ${_window_number};/fset -go ${_chat_line_y}"
@chat(fset.fset):button2* = "hsignal:fset_mouse"
@chat(fset.fset):wheeldown = "/fset -down 5"
@chat(fset.fset):wheelup = "/fset -up 5"
@chat(script.scripts):button1 = "/window ${_window_number};/script go ${_chat_line_y}"
@chat(script.scripts):button2 = "/window ${_window_number};/script go ${_chat_line_y};/script installremove -q ${script_name_with_extension}"
@chat(script.scripts):wheeldown = "/script down 5"
@chat(script.scripts):wheelup = "/script up 5"
@item(buffer_nicklist):button1 = "/window ${_window_number};/query ${nick}"
@item(buffer_nicklist):button1-gesture-left = "/window ${_window_number};/kick ${nick}"
@item(buffer_nicklist):button1-gesture-left-long = "/window ${_window_number};/kickban ${nick}"
@item(buffer_nicklist):button2 = "/window ${_window_number};/whois ${nick}"
@item(buffer_nicklist):button2-gesture-left = "/window ${_window_number};/ban ${nick}"
@item(buflist):button1* = "hsignal:buflist_mouse"
@item(buflist):button2* = "hsignal:buflist_mouse"
@item(buflist2):button1* = "hsignal:buflist_mouse"
@item(buflist2):button2* = "hsignal:buflist_mouse"
@item(buflist3):button1* = "hsignal:buflist_mouse"
@item(buflist3):button2* = "hsignal:buflist_mouse"
@bar:wheeldown = "/bar scroll ${_bar_name} ${_window_number} +20%"
@bar:wheelup = "/bar scroll ${_bar_name} ${_window_number} -20%"
@chat:button1 = "/window ${_window_number}"
@chat:button1-gesture-left = "/window ${_window_number};/buffer -1"
@chat:button1-gesture-left-long = "/window ${_window_number};/buffer 1"
@chat:button1-gesture-right = "/window ${_window_number};/buffer +1"
@chat:button1-gesture-right-long = "/window ${_window_number};/input jump_last_buffer"
@chat:ctrl-wheeldown = "/window scroll_horiz -window ${_window_number} +10%"
@chat:ctrl-wheelup = "/window scroll_horiz -window ${_window_number} -10%"
@chat:wheeldown = "/window scroll_down -window ${_window_number}"
@chat:wheelup = "/window scroll_up -window ${_window_number}"
@*:button3 = "/cursor go ${_x},${_y}"

+ 51
- 0
config/weechat/weechat.log View File

@ -0,0 +1,51 @@
[2021-04-04 01:40:21] WeeChat 3.1 (compiled on Mar 11 2021 21:41:58)
[2021-04-04 01:40:21] Reading configuration file sec.conf
[2021-04-04 01:40:27] Reading configuration file weechat.conf
[2021-04-04 01:40:27] Reading configuration file plugins.conf
[2021-04-04 01:40:27] Reading configuration file charset.conf
[2021-04-04 01:40:27] Reading configuration file logger.conf
[2021-04-04 01:40:27] Reading configuration file exec.conf
[2021-04-04 01:40:27] Reading configuration file trigger.conf
[2021-04-04 01:40:27] Reading configuration file spell.conf
[2021-04-04 01:40:27] Reading configuration file alias.conf
[2021-04-04 01:40:27] Reading configuration file buflist.conf
[2021-04-04 01:40:27] Reading configuration file fifo.conf
[2021-04-04 01:40:27] Reading configuration file xfer.conf
[2021-04-04 01:40:27] Reading configuration file irc.conf
[2021-04-04 01:40:27] Reading configuration file relay.conf
[2021-04-04 01:40:27] Reading configuration file tcl.conf
[2021-04-04 01:40:27] Reading configuration file python.conf
[2021-04-04 01:40:27] Reading configuration file colorize_nicks.conf
[2021-04-04 01:40:27] Reading configuration file autosort.conf
[2021-04-04 01:40:27] Writing configuration file autosort.conf
[2021-04-04 01:40:27] Reading configuration file guile.conf
[2021-04-04 01:40:27] Reading configuration file perl.conf
[2021-04-04 01:40:27] Reading configuration file ruby.conf
[2021-04-04 01:40:27] Reading configuration file lua.conf
[2021-04-04 01:40:27] Reading configuration file script.conf
[2021-04-04 01:40:27] Reading configuration file fset.conf
[2021-04-04 01:40:27] irc: connecting to server chat.freenode.net/6697 (SSL)...
[2021-04-04 01:41:47] Writing configuration file plugins.conf
[2021-04-04 01:41:47] Writing configuration file trigger.conf
[2021-04-04 01:41:47] Writing configuration file spell.conf
[2021-04-04 01:41:47] Writing configuration file relay.conf
[2021-04-04 01:41:47] Writing configuration file lua.conf
[2021-04-04 01:41:47] Writing configuration file ruby.conf
[2021-04-04 01:41:47] Writing configuration file xfer.conf
[2021-04-04 01:41:47] Writing configuration file fifo.conf
[2021-04-04 01:41:47] Writing configuration file exec.conf
[2021-04-04 01:41:47] Writing configuration file buflist.conf
[2021-04-04 01:41:47] Writing configuration file logger.conf
[2021-04-04 01:41:47] Writing configuration file perl.conf
[2021-04-04 01:41:47] Writing configuration file charset.conf
[2021-04-04 01:41:47] Writing configuration file alias.conf
[2021-04-04 01:41:47] Writing configuration file fset.conf
[2021-04-04 01:41:47] Writing configuration file guile.conf
[2021-04-04 01:41:47] Writing configuration file autosort.conf
[2021-04-04 01:41:47] Writing configuration file colorize_nicks.conf
[2021-04-04 01:41:47] Writing configuration file python.conf
[2021-04-04 01:41:47] Writing configuration file irc.conf
[2021-04-04 01:41:47] Writing configuration file tcl.conf
[2021-04-04 01:41:47] Writing configuration file script.conf
[2021-04-04 01:41:47] Writing configuration file weechat.conf
[2021-04-04 01:41:47] Writing configuration file sec.conf

+ 49
- 0
config/weechat/xfer.conf View File

@ -0,0 +1,49 @@
#
# weechat -- xfer.conf
#
# WARNING: It is NOT recommended to edit this file by hand,
# especially if WeeChat is running.
#
# Use /set or similar command to change settings in WeeChat.
#
# For more info, see: https://weechat.org/doc/quickstart
#
[look]
auto_open_buffer = on
progress_bar_size = 20
pv_tags = "notify_private"
[color]
status_aborted = lightred
status_active = lightblue
status_connecting = yellow
status_done = lightgreen
status_failed = lightred
status_waiting = lightcyan
text = default
text_bg = default
text_selected = white
[network]
blocksize = 65536
fast_send = on
own_ip = ""
port_range = ""
send_ack = on
speed_limit_recv = 0
speed_limit_send = 0
timeout = 300
[file]
auto_accept_chats = off
auto_accept_files = off
auto_accept_nicks = ""
auto_check_crc32 = off
auto_rename = on
auto_resume = on
convert_spaces = on
download_path = "%h/xfer"
download_temporary_suffix = ".part"
upload_path = "~"
use_nick_in_filename = on

Loading…
Cancel
Save