@ -0,0 +1,2 @@ | |||||
logs | |||||
logs/** |
@ -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)" |
@ -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}"]" |
@ -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}?.: }" |
@ -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] |
@ -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 |
@ -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 |
@ -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" |
@ -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 |
@ -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 |
@ -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 |
@ -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] |
@ -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 |
@ -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 |
@ -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]."\")"); | |||||
} | |||||
} | |||||
} |
@ -0,0 +1 @@ | |||||
../atcomplete.pl |
@ -0,0 +1 @@ | |||||
../highmon.pl |
@ -0,0 +1 @@ | |||||
../multiline.pl |
@ -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 | |||||
} |
@ -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")" |
@ -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 |
@ -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", "" | |||||
) |
@ -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() |
@ -0,0 +1 @@ | |||||
../aesthetic.py |
@ -0,0 +1 @@ | |||||
../anotify.py |
@ -0,0 +1 @@ | |||||
../autosort.py |
@ -0,0 +1 @@ | |||||
../colorize_nicks.py |
@ -0,0 +1 @@ | |||||
../go.py |
@ -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', '') |
@ -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() |
@ -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] |
@ -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 |
@ -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" |
@ -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" |
@ -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] |
@ -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 |
@ -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 |
@ -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}" |
@ -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 |
@ -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 |