Script: ctrl_w.pl

Change the key ctrl-W to use the readline behavior.
Author: Juerd — Version: 1.02 — License: Public-domain
For WeeChat ≥ 0.3.0.
Tags: input
Added: 2018-09-21 — Updated: 2021-04-05

Download GitHub Repository

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
use strict;
use Encode qw(encode_utf8);
weechat::register(
    'ctrl_w',
    'Juerd <#####@juerd.nl>',
    '1.02',
    'PD',
    'Implement readline-like ^W',
    '',
    ''
);

sub ctrl_w {
    my ($data, $buffer, $args) = @_;

    my $pos = weechat::buffer_get_integer($buffer, 'input_pos');
    my $input = weechat::buffer_get_string($buffer, 'input');

    utf8::decode($input);
    substr($input, 0, $pos) =~ s/((?:^|\S+)\s*)\z// and $pos -= length $1;
    utf8::encode($input);

    weechat::buffer_set($buffer, "input", $input);
    weechat::buffer_set($buffer, "input_pos", $pos);

    return weechat::WEECHAT_RC_OK;
}

weechat::hook_command("ctrl_w", "Delete previous word like readline ^W", "", "", "", "ctrl_w", "");

# Print helpful message if ctrl-W is still bound to the default function.
my $i = weechat::infolist_get("key", "", "default");
weechat::infolist_reset_item_cursor($i);
while (weechat::infolist_next($i)) {
    my $k = weechat::infolist_string($i, "key");
    my $c = weechat::infolist_string($i, "command");
    $k =~ m[^ctrl-w$]i or next;
    $c =~ m[^/input delete_previous_word]i or next;

    weechat::print("", "$k is still bound to $c; to use the ctrl_w script, use /key bind $k /ctrl_w");
    last;
}
weechat::infolist_free($i);