@ -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 |